题目大意:
有n件衣服,每件衣服有一个湿度值a[i],每个单位时间每件衣服可以自然蒸发一点湿度值,现在有一台烘干机,每个单位时间可以使一件衣服减少k点湿度值(烘干期间不会自然蒸发),最少需要多长时间可以使得所有衣服都干掉
分析:
二分答案
为什么这道题要使用二分?
首先这道题是一个最优值问题,也就是最大值最小的问题
其次答案是单调的,满足二分性质
所以此题可以转化为二分答案判断可行性的问题
对于ans,如果a[i]<=ans,那么就让i自然蒸发,否则就要使用ceil(a[i]-ans])/(k-1)时间的烘干机,判断使用烘干机的时间是否满足ans
代码如下:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define int long long
using namespace std;
const int maxn=100000+5;
int n,a[maxn],k,mx=0;
inline bool check(int tim){
int cnt=0;
for(int i=1;i<=n;i++)
if(a[i]>tim)
cnt+=(a[i]-tim+k-1)/k;
if(cnt>tim)
return false;
return true;
}
signed main(void){
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]),mx=max(mx,a[i]);
scanf("%lld",&k);
k--;
if(k==0){
cout<<mx<<endl;
return 0;
}
int l=0,r=mx,ans;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid))
ans=mid,r=mid-1;
else
l=mid+1;
}
cout<<ans<<endl;
return 0;
}
by >_< neighthorn