HNUST 2204 买水果

  1. 卖水果

题目简介:

小明开了一家水果店,出售A、B两种水果。

他每天准备n个水果,其中A、B的数量不定。每天会有n个客人来购买,客人也分为两类,X类客人只买A水果,Y类客人AB两种水果都可。

每当有客人来时,小明会随机从水果篮中取出水果。如果来的是X类客人,但是取出的是B类水果,那么就将取出的B放到一边的盘子里,直到取出A才会卖给X类客人。如果是Y类客人前来购买,当盘子里有B时优先将B售卖给Y,如果没有,就直接将水果篮里取出的水果卖给Y。

小明想知道,他每天准备的水果,能不能满足所有客人的需求。

输入三行数据。

第一行输入1个正整数n(1<=n<=100),表示每天准备的水果数量。

第二行输入一行长度为n,由字母AB组成的字符串,表示小明从水果篮中取出水果的顺序。

第三行输入一行长度为n,由字母X和Y组成的字符串,表示客人到店的顺序。如果当天的水果能满足所有客人的需求,输出”YES”,否则输出”NO”。

样例输入 Copy

5
ABBAA
YXXXY

样例输出 Copy

NO

解法:

首先这个题目一个月前我动不了手,但现在可以轻松完成,也算是自身能力成长的体现吧。

也算是对自身成长的一次记录吧。

题目要求:

  1. 题目会给出 两种客人XY的到来顺序,以及小明拿出水果AB的顺序,这里首先可能要用两个字符数组把顺序给存下来。
  2. 其中有要求X客人只要A水果,Y客人AB水果都收。当来的是X客人,但小明拿出的是B水果时,小明会把B水果放到一旁的盘子里面。当后面再来了Y客人的时候,就直接把盘子里面的水果给Y客人。

题目要求并不算复杂,输入数据阶段不过多阐述,主要是遍历客人的那个过程。

用一个循环,来把所有的客人按顺序遍历一次,直到最后一个客人。

 

由于Y客人AB水果都要,所以如果是Y客人来了,

  1. 如果盘子里面有水果,就直接把盘子里面的水果给他。
  2. 如果没有,则直接cnt++,记录水果计数到了下一个位置。
  3. 如果盘子里面也没有,水果计数也应该到达了最后一个(即第n个),则输出“NO”,结束。

如果是来了X客人,而X客人只收A水果,则要用一个恒成立的while循环来寻找A水果,

  1. 如果找到了A水果,则cnt++,记录水果计数到了下一个位置。
  2. 如果找到的是B水果,则cnt++,且dish++
  3. 如果cnt等于n了,则输出“NO”(因为水果计数是从0开始的,所以下标为n-1的时候,才是最后一个水果)

最后还有判断成功结束的标志

如果客人循环正常结束了,则在最外面加上一个printf(“YES”),就好了,因为不能的情况已经在循环里面就结束为0了。

这段代码当时写的时候,个人经验还不足够,最近结束的地方,还能再修改一下

#include<stdio.h>
#include<string.h>
int main(){
	int n,dish = 0;
	scanf("%d",&n);
	char blanket[n], member[n];
	getchar();
	for(int i=0; i<n; i++){
		scanf("%c",&blanket[i]);
	}
	getchar();
	scanf("%s",member);
	if(strlen(member) > n){
		printf("NO"); return 0;
	}
	int cnt = 0;
	for(int i=0; i<strlen(member); i++){
		if(member[i] == 'Y'){
			if(cnt >= n && dish == 0){
				printf("NO"); return 0;
			}
			if(dish){
				dish--;
			}else{
				cnt++;
			}
		}else{
			while(1){
				if(cnt >= n){
					printf("NO"); return 0;
				}
				if(blanket[cnt] == 'A'){
					cnt++; break;
				}else{
					dish++;
					cnt++;
				}
			}
		}
	}
	if(dish == 0 && cnt == n){
		printf("YES");
	}else{
		printf("NO");
	}
}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值