POJ Drying

2015-07-20 17:42:46 · 作者: · 浏览: 5

Drying


题目链接:Click Here~

题目分析:

给出N件带水的衣服,你有两种选择可以把某件衣服给弄干。一是用烘干机可以每分钟烤干衣服的K滴水。二是每分钟衣服会自然烘干一滴水。而用烘干机的时候就不再自然烘干了。而每件衣服所带的水滴是不一样多的。现在问你最少要多少时间可以把衣服全烘干。


思路分析:

先二分枚举时间。但是判断的条件有点难想到,一开始用暴力判断结果超时了。后来看了博客后才知道只要转换一下公式就可以了判断了。详细解释过程请看代码。


#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         using namespace std; const int MAXN = 100000 + 10; const int INF = ~0U >> 2; int a[MAXN],sum[MAXN]; int N,K; /* 假设烘干时间是x,则自然风干时间为mid - x K*x + (mid - x) >= a[i] x >= (a[i] - mid)/(K - 1) (K != 1) */ bool C(int mid){ unsigned long long sum(0); for(int i = 0;i < N;++i){ int more = a[i] - mid; if(more > 0){ sum += ceil(more + K - 1 / K); //ceil } } return sum <= mid; } //二分时间 void solve(){ int lb = -1,ub = INF; while(ub - lb > 1){ int mid = (lb + ub) / 2; if(C(mid)) ub = mid; else lb = mid; } printf("%d\n",ub); } int main() { while(~scanf("%d",&N)){ for(int i = 0;i < N;++i) scanf("%d",&a[i]); scanf("%d",&K); if(K == 1){ //特判,防止分母为0 printf("%d\n",*max_element(a,a+N)); continue; } K--; solve(); } return 0; } 
       
      
     
    
   
  

??