题意:
每件衣服都有一定单位水分,在不适用烘干器的情况下,每件衣服每分钟自然流失1个单位水分,但如果使用了烘干机则每分钟流失K个单位水分,但是遗憾是只有1台烘干机,每台烘干机同时只能烘干1件衣服,请问要想烘干N件衣服最少需要多长时间?
输入
第一行输入N,表示有N件衣服,第二行输入N件衣服的水分ai,第三行表示烘干机每分钟烘干水分K
其中
1 ≤ N ≤ 100 000,1 ≤ ai ≤ 10^9,1 ≤ K≤ 10^9
输出
输出烘干N件衣服所需要的最短时间
样例输入
3
2 3 9
5
3
2 3 6
5
样例输出
3
2
题解:二分的时候首先减去这个时间作为自然风干,然后烘干器每分钟烘干k-1。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 100010;
int n, k;
ll a[N];
bool C(ll t) {
ll sum = 0; //所用时间
for (int i = 0; i < n; i++) {
//若在t时间内不能自然烘干
if (a[i] - t > 0) {
sum += (a[i] - t + k - 2) / (k - 1); //加上k-2为了向上取整
}
if (sum > t) return false;
}
return true;
}
int main() {
while (scanf ("%d", &n) != EOF) {
ll lb = 0, ub = 0;
for (int i = 0; i < n; i++) {
scanf ("%ld", &a[i]);
ub = max(a[i], ub);
}
scanf ("%d", &k);
if (k == 1) //特殊判断
cout << ub << endl;
else {
while (ub - lb > 1) {
ll m = (ub + lb) / 2;
if (C(m)) ub = m;
else lb = m;
}
cout << ub << endl;
}
}
}