题意:有n个衣服要烘干,每件衣服都有含水量ai,每分钟衣服含水量都可以减少1,用烘干机每分钟含水量减少k,烘干机每次只能放入一件衣物,那么问最少几分钟可以让所有衣服含水量为0。
题解:先把含水量从大到小排序,二分出时间x,然后如果a[i] <= x,就不用烘干机,否则a[i] - 已过去时间 - k * 已使用烘干机次数 <= x - 已过去时间 - 已使用烘干机次数, 从而计算出这件衣服应该用最少几次烘干机(向上取整),然后已过去时间+使用烘干机次数如果大于x,返回false。
#include <stdio.h>
#include <algorithm>
using namespace std;
const int N = 100005;
int n, k, water[N];
bool cmp(int a, int b) {
return a > b;
}
bool judge(int x) {
int num = 0;
for (int i = 0; i < n; i++) {
if (water[i] <= x)
break;
num += (x - water[i]) / (1 - k);
if ((x - water[i]) % (1 - k))
num++;
if (num > x)
return false;
}
return num <= x;
}
int main() {
while (scanf("%d", &n) == 1) {
int sum = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &water[i]);
sum = max(sum, water[i]);
}
scanf("%d", &k);
sort(water, water + n, cmp);
if (k <= 1) {
printf("%d\n", water[0]);
continue;
}
int l = 0, r = sum;
while (l < r) {
int mid = (l + r) / 2;
if (judge(mid))
r = mid;
else
l = mid + 1;
}
printf("%d\n", l);
}
return 0;
}