moiezen
这题是个随机化+二分裸题……………………考场上居然没有想出来……想的出来就怪了吧
我们随机一下增加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;
}
moiezen的更多相关文章
- moiezen(2018.10.16)
题意:有n件行李,编号为1~n.行李的质量是模 P 意义下的(P不一定是质数).有 k 个背包,要装下这些行李,为了方便在背包中找行李,每个背包中的行李编号是连续的,允许有背包为空.我们想让最重的背包 ...
随机推荐
- C语言不容易识别的坑
1.重复两次定义 #include<stdio.h> #include<stdlib.h> #include<string.h> int a,b; void fun ...
- parse XML & JSON & js
parse XML & JSON & js how to parse xml data into json in js? https://stackoverflow.com/quest ...
- 【IntelliJ 】IntelliJ IDEA 自动导入包 快捷方式 关闭重复代码提示
idea可以自动优化导入包,但是有多个同名的类调用不同的包,必须自己手动Alt+Enter设置 设置idea导入包 勾选标注 1 选项,IntelliJ IDEA 将在我们书写代码的时候自动帮我们优化 ...
- struts2开发action 的三种方法以及通配符、路径匹配原则、常量
struts2开发action 的三种方法 1.继承ActionSupport public class UserAction extends ActionSupport { // Action中业务 ...
- mysql控制流程函数(case,if,ifnull,nullif)
1.case...when... 用法 参考:http://www.cnblogs.com/qlqwjy/p/7476533.html CASE value WHEN [compare-value] ...
- Uva - 11181 Probability|Given (条件概率)
设事件B为一共有r个人买了东西,设事件Ai为第i个人买了东西. 那么这个题目实际上就是求P(Ai|B),而P(Ai|B)=P(AiB)/P(B),其中P(AiB)表示事件Ai与事件B同时发生的概率,同 ...
- codevs——6221 数的统计
6221 数的统计 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 有一个人名字叫A,B总喜欢打他. 这 ...
- Ubuntu 16.04 GNOME添加桌面图标/在桌面上显示图标
GNOME默认不能在桌面上创建文件夹,但是可以通过工具设置:用gnome-tweak-tool设置Nautilus接管桌面即可. 安装: sudo apt-get install gnome-twea ...
- 【转】golang中的并行与并发
原文:http://blog.csdn.net/taohaoge/article/details/27970421 ------------------------------------------ ...
- SpringBoot 基于jjwt快速实现token授权
1.添加maven依赖注解 <!--JJWT库--> <dependency> <groupId>io.jsonwebtoken</groupId> & ...