【二分】——COCI2008 猴子摘桃

Description

  动物园内最受欢迎就是猴子了,因为它们除了能爬能跳外还会很多技能。其中A类猴子特别擅长爬树摘桃,而B类猴子擅长把桃子掰成两半。
  A类猴子有N只,编号为1到N,B类猴子有M只,编号为1到M。A类猴子中的第K只摘到第一个桃子需要花费A_k秒,此后每B_k秒就能摘到桃子;B类猴子中的第K只掰开第一个桃子需要花费C_k秒,此后每D_k秒就能掰开一个桃子。
  不幸的是,B类猴子非常具有侵略性,两种猴子不能同时待在场地内,因此,园长必须在A类猴子摘完所有桃子后立刻把它们带走,然后立刻让B类猴子进园;同样当B类猴子把所有桃子全部掰开后也不能待在场地内太久,因为它们之间也会发生冲突,所有园长将在B类猴子掰开所有桃子后立刻送走它们。
  园长带走猴子和猴子进园的速度非常快,时间忽略不计。
  Alice非常喜欢看B类猴子掰桃子,告诉你表演的总时间,但不知道一共有多少个桃子,请你帮Alice计算B类猴子进入动物园的时刻。
 

Input

  输入文件第一行包含一个整数T(1<=T<=1000000000),表示猴子表演的总时间。
  接下来一行包含一个整数N(1<=N<=100),表示A类猴子的数量。
  接下来N行,每行包含两个整数A_k和B_k(1<=A_k,B_k<=1000000000),描述A类每只猴子摘桃的速度。
  接下来一行包含一个整数M(1<=M<=100),表示B类猴子的数量。
  接下来M行,每行包含两个整数C_k和D_k(1<=C_k,D_k<=1000000000),描述B类每只猴子掰桃的速度。

Output

  输出两类猴子进园的时刻相差多少秒。

 

  二分能完成的题目一般都有个特点:答案一定是具有单调性且有固定值域的,假如我们枚举时间,那么它的值域即为(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 } 
posted @ 2019-09-03 20:22  Nelson992770019  阅读(200)  评论(0编辑  收藏  举报