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 }
越努力,越幸运