2021CCPC广州站c .项链
题目:C. Necklace
题意:
https://codeforces.com/gym/103415/problem/C
?长度为n的项链上有m颗珠子,每颗珠子分成一段,最长一段的最小长度被要求。
思路:二分+贪心
?每张支票贪婪地从第一个位置开始,所以开始时的最大偏移量为:n-a[m] a[1]-1,mi代表当前起始位置的最大偏移量,每个区间mi都要取最小值,否则初始位置偏移量会超过他的区间,cnt记录初始起始位置的最大向前偏移量。
代码:
#包含位/stdc。h
使用命名空间标准;
typedef long long ll
#定义整数长
const int mod=998244353
const int N=1e6 10
# define GC()(is==itit=(is=in)fread(in,1,Q,stdin),(is==itEOF:*is ):*is)
const int Q=(124)1;
char in[Q],*is=in,*it=in,c;
int n,m;
无效读取(long long n){ 0
for(n=0;(c=GC())“0”| | c“9”;);
for(;c=' 9 ' c=' 0c=GC())n=n * 10 c-48;
}
int a[N];
bool check(int x){ 0
int mi=n-a[m]a[1]-1;//当前起始位置的最大偏移量
int mm=mi
int now=0;//用于记录上一段需要下一段补充的大小。
int CNT=0;//记录初始起始位置的总最大向前偏移。
for(int I=1;im;I){ 0
int xx=x-now;//x-减去要分配给前一部分的值表示可以分配给当前时间间隔的值。
int cha=a[I 1]-a[I];//当前段的大小
如果(xx=0)返回false//如果不能分配到下一个区间,就是违法的。
if(chaxx){ 0
now=a[I 1]-(a[I]xx);
mi=min(mi,xx-1);
}
else{
now=0;
int m1=min(mi,xx-cha);
cnt=m1
mi=min(mi-m1,cha-1);
}
}
int ans=now mm 1-x;//当前段需要增加多少个前一段-x=当前段需要划分多少个偏移量。
if(x-now=mm 1||cnt=ans)返回true//可以给最后一个区间的值大于最后一个区间的大小或者可以移位的总量=仍然需要移位的量。
返回false
}
签名main(){ 0
IOs :3360 sync _ with _ stdio(false);
CIN . tie(0);cout . tie(0);
读(n),读(m);
for(int I=1;I=m;I){ 0
读作(a[I]);
}
int l=1,r=n;
while(lr){ 0
int mid=(l r)1;
if(check(mid))r=mid;
否则l=mid 1;
}
printf('%lld\n ',l);
返回0;
}
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/107449.html