moiezen
2024-08-30 22:38:21
这题是个随机化+二分裸题……………………考场上居然没有想出来……想的出来就怪了吧
我们随机一下增加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;
}
最新文章
- C/C++ 结构体 数组 简单输入输出
- java中的static详解
- a byte of python (摘01)
- JS,Jquery,ExtJs不同脚本动态创建DOM对象
- Smarty模板
- Python学习教程(learning Python)--1.2.1 Python输出语句print基本使用
- Java笔记(十)&hellip;&hellip;面向对象II封装(Encapsulation)
- 史上最简单的带流控功能的http server
- [C#] 用一种更优美的方式来替换掉又多又长的switch-case代码段
- Kth Largest Element in an Array 解答
- Silverlight学习(三)
- 一个SysLog实现
- HDU 4882 ZCC Loves Codefires(贪心)
- OSG+VS2010+win7环境搭建
- xv6的设计trick(不断更新)
- 移动端H5页面遇到的问题总结
- JAR包介绍大全用途作用详解JAVA
- Apache 、Tomcat、Nginx的区别
- Prometheus 企业微信报警/inhibit抑制 /静默(二)
- ios 自动化构建 code-select: error: tool &#39;xcodebuild&#39; requires Xcode, but active developer directory.....