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类猴子进入动物园的时刻。
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 }
——抓住了时间,却不会利用的人,终究也逃不过失败的命运。