[codeforces 1374C] A Cookie for You 烦人的if,else

独自空忆成欢 提交于 2020-08-05 09:06:07

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,但是编写过程中,考虑情况颇多,头皮发麻。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!