https://vjudge.net/problem/POJ-3104
直接二分答案,然后判断答案的正确性。
假设当前二分的答案为 t,那么:
对于ai <= t的衣服,显然让它们自然风干就可以了。
对于ai > t的衣服,我们需要知道该衣服最少用多少次烘干机。
设该衣服用了x1分钟风干,用了x2分钟烘干机。
那么有 x1 + x2 = t 和 ai <= x1 + x2 * k,联立两式可得 x2 >= (ai - t) / (k - 1),即最少使用次数为[(ai - t) / (k - 1)] 的最小上界。
最后,判断一下总使用次数是否少于 t 即可。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define ll long long
int n,k;
ll l=0,r=0;
ll a[100005];
bool ok(ll t){
ll cnt=0;
for (int i=0;i<n;i++){
if (a[i]>t){
cnt+=ceil((double)(a[i]-t)/(k-1));
}
}
return cnt<=t;
}
int main(){
cin >> n;
for (int i=0;i<n;i++){
scanf("%lld",&a[i]);
r=max(r,a[i]);
}
cin >> k;
if (k==1){
cout << r << endl;
return 0;
}
for (int i=0;i<50;i++){
ll mid=(l+r)>>1;
if (ok(mid)){
r=mid;
}
else{
l=mid;
}
}
cout << r << endl;
}