标签:
二分.
最大化最小值.
y为原来的最大时间.然后二分可行时间x,如果有自然风干时间>x的,用吹分机加速,多出的时间用多的速度弥补,并向上取整,看吹风机是否够用.
注意:
1.k=1时,v=k-1=0,不能做除数.............要特判.........
1 #include<cstdio> 2 #include<algorithm> 3 using std :: max; 4 5 const int maxn=100005; 6 int n,k,x,y; 7 int a[maxn]; 8 9 bool C(int x) 10 { 11 int rest=x; 12 for(int i=1;i<=n;i++) 13 { 14 if(a[i]>x) 15 { 16 int d=a[i]-x; 17 int v=k-1; 18 int res=d/v; 19 if(d%v!=0) res++; 20 rest-=res; 21 } 22 if(rest<0) return false; 23 } 24 return true; 25 } 26 27 void solve() 28 { 29 while(x<y) 30 { 31 int m=x+(y-x)/2; 32 if(C(m)) y=m; 33 else x=m+1; 34 } 35 printf("%d\n",x); 36 } 37 38 void init() 39 { 40 scanf("%d",&n); 41 for(int i=1;i<=n;i++) { scanf("%d",&a[i]); y=max(y,a[i]); } 42 scanf("%d",&k); 43 } 44 45 int main() 46 { 47 freopen("dry.in","r",stdin); 48 freopen("dry.out","w",stdout); 49 init(); 50 if(k==1) 51 { 52 printf("%d\n",y); 53 return 0; 54 } 55 solve(); 56 fclose(stdin); 57 fclose(stdout); 58 return 0; 59 }
标签:
原文地址:http://www.cnblogs.com/Sunnie69/p/5423821.html