题意
思路
这道题可以二分总的晾干时间,注意需要理解出题目的意思,就是一件衣服可以自然烘干,也可以使用散热器烘干。所以假设一件衣服最后的烘干时间是 x x x,那么我们可以假设自然烘干无时无刻不再进行,也就是说,其中有 x x x的水分被自然烘干,那么对于一件包含 a [ i ] a[i] a[i]水分的衣服来说:
- 假如 a [ i ] ≤ x a[i]\leq x a[i]≤x,那么就可以直接忽略掉,把宝贵的散热器留给其他衣服用
- 假如 a [ i ] > x a[i] > x a[i]>x,那么说明这件衣服除了自然烘干外,剩下的水分必须使用散热器烘干。而需要注意的是,我们在考虑自然烘干的时候,把其设置成了每时每刻都在进行,所以,在使用散热器的对水分蒸发的贡献时,需要去掉其中预先假定包含自然烘干的时间,也就是说,原来题意中的散热器每分钟蒸发 k k k水分,这时候单纯考虑散热器的作用时,要 − 1 -1 −1,即减去其中自然蒸发的贡献。
- 最后我们看实际需要的烘干时间和二分预期的烘干时间之间的比较进行二分决策的转移
- 另外还要注意的是,这里的二分还是求的满足条件的最小下界
代码
void D(){
int n;
scanf("%d",&n);
vector<ll> a(n,0);
ll sum=0,ma=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
sum+=a[i];
ma=max(ma,a[i]);
}
ll k;
scanf("%lld",&k);
ll l=0,r=sum;
if(k==1) {
printf("%lld\n",ma);
return;
}
//这里的二分是满足条件的下限
while(l<r){
ll mid=l+(r-l)/2;//需要的总时间
ll cnt=0;//实际需要的时间
for(int i=0;i<n;i++){
if(a[i]<=mid) continue;
cnt+=(a[i]-mid+k-2)/(k-1);
if(cnt>mid) break;
}
if(cnt>mid) l=mid+1;
else r=mid;
}
printf("%lld\n",l);
}