【二分】——COCI2008 猴子摘桃
1422. 猴子摘桃 (Standard IO)
Time Limits: 1000 ms Memory Limits: 65536 KB Detailed Limits
二分能完成的题目一般都有个特点:答案一定是具有单调性且有固定值域的,假如我们枚举时间,那么它的值域即为(0,t),因此在这个区间二分答案,对于一个状态,比较摘下来的桃子比劈开的桃子多还是少,来重新确定范围。
细节请看标程。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=110; 4 int t,n,m; 5 int x_1[N],x_2[N]; 6 int y_1[N],y_2[N]; 7 int ans; 8 int read(){ 9 int x=0,f=1; 10 char c=getchar(); 11 while(!isdigit(c)){ 12 if(c=='-') f=-1; 13 c=getchar(); 14 } 15 while(isdigit(c)){ 16 x=x*10+c-'0'; 17 c=getchar(); 18 } 19 return x*f; 20 } 21 int main(){ 22 t=read(); 23 n=read(); 24 for(int i=1;i<=n;i++){ 25 x_1[i]=read(); 26 x_2[i]=read(); 27 } 28 m=read(); 29 for(int i=1;i<=m;i++){ 30 y_1[i]=read(); 31 y_2[i]=read(); 32 } 33 int l=0,r=t; 34 while(l<=r){ 35 int mid=(l+r)>>1,tg1=0,tg2=0; 36 for(int i=1;i<=n;i++){ 37 if(mid>=x_1[i]){ 38 tg1+=1+(mid-x_1[i])/x_2[i]; 39 } 40 } 41 for(int i=1;i<=m;i++){ 42 if(t-mid>=y_1[i]){ 43 tg2+=1+(t-mid-y_1[i])/y_2[i]; 44 } 45 } 46 if(tg1<=tg2){ 47 ans=mid; 48 l=mid+1; 49 } 50 else r=mid-1; 51 } 52 printf("%d",ans); 53 return 0; 54 }
——抓住了时间,却不会利用的人,终究也逃不过失败的命运。