POJ 3104 Drying(二分答案)
【题目链接】 http://poj.org/problem?id=3104
【题目大意】
给出n件需要干燥的衣服,烘干机能够每秒干燥k水分,
不在烘干的衣服本身每秒能干燥1水分
求出最少需要干燥的时间。
【题解】
考虑将烘干机的烘干效应变为k-1,那么就是每件衣服在每秒都会自动减少一水分
如果我们知道最少需要的时间,那么每件衣服自己减少的水分数量就知道了,
在除去自然减少的水分之后,看看还需要多少k-1的水分减少才能烘干全部的衣服就可以了,
因此我们二分这个答案,验证是否可行即可。
【代码】
#include <cstdio> #include <algorithm> using namespace std; const int N=100010; int n,k,a[N]; bool check(int x){ int cnt=0; for(int i=1;i<=n;i++){ if(a[i]-x<=0)continue; cnt+=(a[i]-x+k-2)/(k-1); //printf("%d\n",cnt); if(cnt>x)return 0; }return 1; } int main(){ while(~scanf("%d",&n)){ int l=1,r=0,ans; for(int i=1;i<=n;i++)scanf("%d",&a[i]),r=max(r,a[i]); scanf("%d",&k); if(k==1){printf("%d\n",r);continue;} while(l<=r){ int mid=(l+r)>>1; //printf("%d %d %d\n",l,r,mid); if(check(mid))ans=mid,r=mid-1; else l=mid+1; }printf("%d\n",ans); }return 0; }
愿你出走半生,归来仍是少年