Codeforces Round #654 (Div. 2) 参与排名人数14349 本场比赛主要心思放在观摩高手如何打比赛,发现初中生真的很厉害。
[codeforces 1374C] A Cookie for You 烦人的if,else
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址http://codeforces.com/contest/1371/problem/C
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
C - A Cookie for You | GNU C++17 | Accepted | 31 ms | 200 KB |
题目大意:给a块vanilla cookies,b块chocolate cookies,n个第一类客人,m个第二类客人,
若:轮到第一类客人时,若a>b,客人吃vanilla cookies,若a<=b,客人吃chocolate cookies.
轮到第二类客人时,若a>b,客人吃chocolate cookies,若a<=b,客人吃vanilla cookies.
若轮到客人没有相应cookies吃时,要生气。
问怎么安排客人吃cookies的顺序时,使客人都能吃上,输出Yes,若怎么安排,客人都吃不上,输出No.
样例模拟如下:
发现,需先处理成a==b,之后,第一类人可以交替消耗a,b,而第二类人,只能消耗b.故先安排第二类人吃,再安排第一类人吃。
2 2 1 2
Yes
a b n m
2 2 1 2
因a==b,先处理m,处理之后
a b n m
2 0 1 0
再处理n,处理之后
a b n m
1 0 0 0
输出Yes
0 100 0 1
No
a b n m
0 100 0 1
因a<b先处理大的(b),n处理之后
a b n m
0 100 0 1
再处理m,处理之后
a b n m
-1 100 0 0
输出No
12 13 25 1
No
a b n m
12 13 25 1
因a<b先处理大的(b),n处理之后
a b n m
12 12 24 1
再处理m,处理之后
a b n m
11 12 24 0
再处理n,处理之后
a b n m
11 11 23 0
a b n m
11 10 22 0
a b n m
10 10 21 0
a b n m
10 9 20 0
a b n m
9 9 19 0
......
a b n m
0 0 1 0
n未处理干净,输出No
AC代码如下:
#include <stdio.h>
#define LL long long
int main(){
int t;
LL a,b,n,m,c;
scanf("%d",&t);
while(t--){
scanf("%lld%lld%lld%lld",&a,&b,&n,&m);
if(a>b){//先消耗多的a
c=a-b;//争取处理成a==b
if(n>=c)n-=c,a=b;
else n=0,a-=n;//n<c
if(a>b){//处理后,还是a>b
if(b>=m)printf("Yes\n");
else printf("No\n");
}else if(a==b){
b-=m;//先处理第二类人
if(b<0){printf("No\n");continue;}
n-=a+b;//再处理第一类人
if(n>0)printf("No\n");
else printf("Yes\n");
}
}else if(a<b){//先消耗多的b
c=b-a;
if(n>=c)n-=c,b=a;
else n=0,b-=n;//n<c
if(a<b){//处理后,还是a<b
if(a>=m)printf("Yes\n");
else printf("No\n");
}else if(a==b){
b-=m;//先处理第二类人
if(b<0){printf("No\n");continue;}
n-=a+b;//再处理第一类人
if(n>0)printf("No\n");
else printf("Yes\n");
}
}else if(a==b){
b-=m;//先处理第二类人
if(b<0){printf("No\n");continue;}
n-=a+b;//再处理第一类人
if(n>0)printf("No\n");
else printf("Yes\n");
}
}
return 0;
}
总结,明知此题考察if,else,但是编写过程中,考虑情况颇多,头皮发麻。
来源:oschina
链接:https://my.oschina.net/u/4267539/blog/4333271