题意:有n件湿的衣服,a[i]表示是每件衣服湿的程度,有一台干衣机,每分钟可以干k个湿度,不用干衣机的衣服没分钟会风干一个湿度。求最少多少分钟所有衣服可以全部变干。
题记:用二分在1~湿度最大的衣服的湿度之间找mid(最坏的情况是不用干衣机,这样让所有衣服全部变干的时间是湿度最大的衣服的湿度)。
当某一件衣服a[i]的值大于mid,那么这件衣服就需要用干衣机,首先设a[i]用了t时间的干衣机,那么a[i]风干的时间为mid-t,可得a[i]需要用干衣机的时间为a[i]-(mid-t)。之后我们的问题就是如何去求这个t了。
这时候我们可以得到一个式子:
k * t ≥a[i] - ( mid -t )
移项之后可得:
t ≥ ( a[i] - mid) / ( k - 1 )
即t在计算时要向上取整
当k为1时要特判一下直接输出湿度最大的衣服即可。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=1e5+10;
typedef long long ll;
ll a[N],n,k;
bool check(ll x){
ll sum=0;
for(int i=0;i<n;i++){
if(a[i]>x){
ll t=ceil((a[i]-x)*1.0/(k-1));
sum+=t;
}
}
if(sum<=x) return true;
else return false;
}
void bsearch(){
ll l=1,r=a[n-1];
while(l<r){
ll mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
cout<<r<<endl;
}
int main(){
scanf("%lld",&n);
for(int i=0;i<n;i++) scanf("%lld",&a[i]);
scanf("%lld",&k);
sort(a,a+n);
if(k==1){
printf("%lld\n",a[n-1]);
return 0;
}
bsearch();
return 0;
}