首页 > 代码库 > POJ Drying

POJ Drying

                                Drying


题目链接:Click Here~

题目分析:

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


思路分析:

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


#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cmath>
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;
}



POJ Drying