CSP认证真题 201909-2 小明种苹果(续)

CSP认证真题 201909-2 小明种苹果(续) 小明可太难了

题目

在这里插入图片描述在这里插入图片描述在这里插入图片描述

话不多说先放源码

#include<iostream>
using namespace std;

int sign[1000];

int main(){
	//接收数据
	//计算发生苹果掉落的果树的棵数
	//计算剩余果子总个数 
	 int N , m , D ,T = 0;
	 cin>>N;
	 for(int i=0; i<N; i++){
	 	int a,b;
	 	cin>> m>> a;
	 	bool flag = true;
	 	for(int j=1; j<m; j++){
	 		cin>> b;
	 		if(b > 0&&a!=b){
	 			if(flag){
	 				D++;
				 }
				 a = b;
				 flag = false;
				 sign[i] = 1; 
			 }else if(b <= 0){
			 	a+= b;
			 }
		 }
		 T+= a;
	 } 
	 //寻找连续三棵树落果的组数
	int E=0;
	int flag2=0;
	for(int i=0,j=0; i<N+2; i++){
		if(sign[j]==1){
			flag2++;
		}else{
			flag2=0;	
		}
		if(flag2>=3){
			E++;
		}
		j++;
		j= j % N;
	}
	cout<< T<<" "<< D<<" "<< E; 
	 return 0;
} 
写在前面

上面的代码是改过几次的最终版本,自己写的第一版延续了第一题的做法,两个测试用例是都可以通过的,但提交OJ只能拿到50分,最后发现是计算苹果总数和落果棵树出现了问题,由于代码比较繁琐,这里就不展示出来了。

解题思路

首先,第一个输出剩余苹果总数T比较简单类似于第一题的做法,无非是增加了一个判断。首先赋值一个变量a等于当前果树原始苹果总数,当后续操作中出现>0的数,则代表重新统计了该棵果树的苹果总数,将此时重新统计后的苹果总数赋值给a,若出现的是<0的数,代表进行了疏果操作,则让a+上这个负值,再用循环让T+=a即可。
其次,第二个输出落果果树总棵数D,这个输出可以在求T的时候一并求出,只需对加和负数过的a以及重新统计过的b进行比较,二者不等就意味着落果了,令D++,此时需要一个布尔型的标识来保证不会重复递增D造成错误。并且引入一个一维数组sign伏笔第三个输出
最后,第三个输出3个落果果树连续的组数E,第三问相当于是将这所有的一串果树首位相连组成一个圈,当然实际情况是一个“单向的队列”,第一项和最后一项是无法判断的,这样则可以将循环增加两次,并从数组下标1开始,当进行到第N次循环时,则是对导数第二棵树导数第一棵树以及第一棵树的判断,N+1项则是倒数第一棵树、第一棵树、第二棵树的判断。(注意:特别容易出错的一个点是,但只有三棵树时,且三棵树均落果了,此时的组数E应为3而不是1)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值