这题是个随机化+二分裸题……………………考场上居然没有想出来……想的出来就怪了吧

我们随机一下增加x的顺序,然后进行二分之前,看看这个x加完之后能不能更新答案,不能就不二分了。具题解所说,这个复杂度是\(logp\)的。

第一次见这种东西,比较蛇皮。

代码如下:

#include <ctime>
#include <cstdio>
#include <algorithm>
using namespace std; const int maxn=10005,inf=2e9; int n,p,k,ans;
int a[maxn],b[maxn],fake[maxn]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} bool check(int limit) {
int cnt=0,tmp=0;
for(int i=1;i<=n;i++) {
if(tmp+b[i]<=limit)tmp+=b[i];
else tmp=b[i],cnt++;
}
return cnt<k;
} int solve(int v) {
int l=0,r=ans;
for(int i=1;i<=n;i++)
b[i]=(a[i]+v)%p,l=max(l,b[i]);
if(!check(ans-1))return ans;
while(l<r) {
int mid=(l+r)>>1;
if(check(mid))r=mid;
else l=mid+1;
}
return r;
} int main() {
srand(time(0));
n=read(),p=read(),k=read();
for(int i=1;i<=n;i++)
a[i]=read(),ans+=a[i];
for(int i=0;i<p;i++)fake[i]=i;
random_shuffle(fake,fake+p);
for(int i=0;i<p;i++)
ans=min(ans,solve(fake[i]));
printf("%d\n",ans);
return 0;
}

最新文章

  1. C/C++ 结构体 数组 简单输入输出
  2. java中的static详解
  3. a byte of python (摘01)
  4. JS,Jquery,ExtJs不同脚本动态创建DOM对象
  5. Smarty模板
  6. Python学习教程(learning Python)--1.2.1 Python输出语句print基本使用
  7. Java笔记(十)&hellip;&hellip;面向对象II封装(Encapsulation)
  8. 史上最简单的带流控功能的http server
  9. [C#] 用一种更优美的方式来替换掉又多又长的switch-case代码段
  10. Kth Largest Element in an Array 解答
  11. Silverlight学习(三)
  12. 一个SysLog实现
  13. HDU 4882 ZCC Loves Codefires(贪心)
  14. OSG+VS2010+win7环境搭建
  15. xv6的设计trick(不断更新)
  16. 移动端H5页面遇到的问题总结
  17. JAR包介绍大全用途作用详解JAVA
  18. Apache 、Tomcat、Nginx的区别
  19. Prometheus 企业微信报警/inhibit抑制 /静默(二)
  20. ios 自动化构建 code-select: error: tool &#39;xcodebuild&#39; requires Xcode, but active developer directory.....

热门文章

  1. BBS+Blog项目代码
  2. 【HDOJ3341】Lost&#39;s revenge(AC自动机,DP)
  3. 守护进程详解及创建,daemon()使用
  4. P1631 序列合并 洛谷
  5. 【转】关于easyui tab 加载 js ajax 不走后台的问题, 怕找不到 以防万一
  6. JSP的文件上传
  7. [转] ASPNET Core 中获取应用程序物理路径
  8. Port forwarding with xinetd Ask
  9. centos7 禁止 root ssh login
  10. 手动加入SSH支持、使用c3p0