1422. 猴子摘桃 (Standard IO)
Time Limits:
1000 ms Memory Limits: 65536 KB Detailed Limits
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类猴子进入动物园的时刻。
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类每只猴子掰桃的速度。
接下来一行包含一个整数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 }