POJ-3104 Drying---二分答案判断是否可行

题目链接:

https://cn.vjudge.net/problem/POJ-3104

题目大意:

有一些衣服,每件衣服有一定水量,有一个烘干机,每次可以烘一件衣服,每分钟可以烘掉k滴水。每件衣服每分钟可以自动蒸发掉一滴水,用烘干机烘衣服时不蒸发。问最少需要多少时间能烘干所有的衣服。

解题思路:

二分答案,然后判断是否可行,如果可行说明当前解>=最优解,区间左移(r = mid - 1)

反之区间右移

坑点:k = 1的时候需要特判。

而且在特判一个解得时候,对每件衣服的水量先减去所花的时间,此时计算烘干机的时间的时候,蒸发量是k - 1而不是k,因为每分钟蒸发一滴水已经算过了

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 typedef long long ll;
 7 const int maxn = 1e6 + 10;
 8 int n, k;
 9 const ll INF = 1e9 + 7;
10 ll a[maxn];
11 bool judge(ll x)
12 {
13     ll sum = 0;
14     for(int i = 1; i <= n; i++)
15     {
16         if(a[i] - x > 0LL)
17         {
18             sum += (a[i] - x + k - 2) / (k - 1);//使用烘干机的时间
19         }
20     }
21     return sum <= x;
22 }
23 int main()
24 {
25     cin >> n;
26     for(int i = 1; i <= n; i++)scanf("%lld", &a[i]);
27     cin >> k;
28     if(k == 1)
29     {
30         cout<<(*max_element(a + 1, a + 1 + n))<<endl;
31         return 0;
32     }
33     ll l = 1, r = INF, ans;
34     while(l <= r)
35     {
36         ll mid = (l + r) / 2;
37         if(judge(mid))
38         {
39             ans = mid;
40             r = mid - 1;
41         }
42         else l = mid + 1;
43     }
44     cout<<ans<<endl;
45     return 0;
46 }

 

posted @ 2018-05-10 20:28  _努力努力再努力x  阅读(171)  评论(0编辑  收藏  举报