poj3104 Drying---二分
题目链接:https://vjudge.net/problem/POJ-3104
题意:每件衣服都有一定单位水分,在不使用烘干器的情况下,每件衣服每分钟自然流失1个单位水分,但如果使用了烘干机则每分钟流失K个单位水分。只有1台烘干机,每台烘干机同时只能烘干1件衣服,烘干N件衣服最少需要多长时间?
有点麻烦的是水分的自然流失,所以如果能先得出时间就好了;又因为时间长更有可能全部烘干(单调性),所以考虑二分答案。对于二分的m,判断能不能让全部衣服干。如果ai<=m,那么只要让水分自然流失就行,所以只要对ai>m的情况用烘干器。考虑对于每个ai需要烘干的时间t,则有 k*t+(m-t)>=ai,即t>=(ai-m)/(k-1),向上取整。如果m小于额外时间的和,则不能全部烘干,check返回false。对于k=1的情况要特判一下
#include<cstdio> #include<algorithm> using namespace std; const int maxn=1e5+10; int t,n,i,j,k,l,r; int a[maxn]; bool check(int m){ int time=m; for (int i=1;i<=n;i++){ if (a[i]<=m) continue; int t=(a[i]-m)/(k-1); //* if ((a[i]-m)%(k-1)!=0) t++; time-=t; if (time<0) return false; } return true; } int main(){ while (~scanf("%d",&n)){ int tmax=0; for (i=1;i<=n;i++) { scanf("%d",&a[i]);tmax=max(tmax,a[i]); } scanf("%d",&k); if (k==1){ //* printf("%d\n",tmax);continue; } l=0;r=1e9; while (r-l>1){ int m=(l+r)/2; if (check(m)) r=m;else l=m; } printf("%d\n",r); } return 0; }