Drying POJ - 3104
作者:互联网
考察:二分
第一次做这题我还以为是dfs.....
思路:
首先烘干时间符合单调性,二分烘干时间,难点在如何写判断函数.首先两种情况:
- a[i]<=s,直接无视.
- a[i]>s,需要考虑它用烘干机的时间,注意不能直接算把它烘干完的时间,因为浪费的时间没有利用,假设它用烘干机的时间是t,那么a[i]-t*k<=mid-t(即烘干剩下的水分必须能被剩余时间自动晒干),移项 mid>=a[i]-t*(k-1). mid已知,a[i]已知,k已知,未知是t,因为t是使用烘干机的时间,对所有衣服进行累加,如果和>mid此解不可行.
注意:要特别处理k=1的情况.有除法就要考虑/0
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 typedef long long LL; 7 const int N = 100010; 8 int a[N],n,k; 9 bool check(LL s) 10 { 11 LL res = 0; 12 for(int i=1;i<=n;i++) 13 if(a[i]>s&&k>1) 14 res += (LL)(a[i]-s+k-2)/(k-1); 15 else if(a[i]>s&&k==1) return 0; 16 if(res<=s) return 1; 17 return 0; 18 } 19 int main() 20 { 21 while(scanf("%d",&n)!=EOF&&n) 22 { 23 LL r = 0; 24 for(int i=1;i<=n;i++) scanf("%d",&a[i]),r=r+a[i]; 25 scanf("%d",&k); 26 LL l = 1; 27 while(l<r) 28 { 29 LL mid = l+r>>1; 30 if(check(mid)) r = mid; 31 else l = mid+1; 32 } 33 printf("%lld\n",r); 34 } 35 return 0; 36 }
标签:3104,res,LL,Drying,mid,int,POJ,烘干机,include 来源: https://www.cnblogs.com/newblg/p/14489286.html