poj 3104 晾衣服问题 最大化最小值
题意:n件衣服各含有ai水分,自然干一分钟一个单位,放烘干机一分钟k个单位,问:最短时间?
思路:
- mid为最短时间
- 如果 a[i]-mid>0说明需要放入烘干机去烘干 烘干的时间为x 那么满足 kx+(mid-x)>=a[i] 可以推出 x=(a[i]-mid)/(k-1),记住要向上取余
- 把所有需要烘干机烘干的时间都加起来 ans. 如果ans>mid 说明mid太小 增加下限 反之减少上限
- 刚开始下限为 1,上限为 max
- 如果k==1 则结果为 max
解决问题的代码:
#include<iostream> #include<cstdio> #include<cstring> #include <algorithm> using namespace std; int n, k; int x[100001]; bool solve(int mid) { int ant = 0; for (int i = 0; i < n; i++) { int more = x[i] - mid; if (more > 0) { ant += (more + k - 1) / k; if (ant > mid) return true; } } return false; } int main() { scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &x[i]); scanf("%d", &k); k--; if (k == 0) { printf("%d\n",*max_element(x, x + n)); return 0; } int lb = *min_element(x, x + n) / k; int ub = *max_element(x, x + n); while (ub - lb > 1) { int mid = (ub + lb) / 2; if (solve(mid)) lb = mid; else ub = mid; } printf("%d\n", ub); return 0; }
君子知命不惧,自当日日自新