csp小明种苹果(续)c++满分实现,完整逻辑

思路:(注意summ和sum1都是负数,所以不能减,要用+)

1.首先,通过输入获取一个整数n,表示苹果树的个数。
2.创建一个数组flag,用于标记每棵苹果树是否掉落了苹果。
3.进入一个循环,循环次数为n。在每次循环中,进行以下操作:
a. 获取一个整数m,表示当前苹果树上的苹果个数。接着创建一个数组temp,用于存储每个正数。
b. 遍历m次,将每个数存储在temp数组中,并进行相应的操作:

4.如果当前数小于等于0,表示需要进行疏果操作,累加到sum1变量中。
5.如果当前数大于0,表示该数为正数,将其存储在temp数组中,同时对计数器cnt加1,并在summ中累加sum1的值,最后将sum1重置为0。
c. 判断最后一个数是否大于0:

6.如果sum1等于0,表示最后一个数是正数或者一直是0,将最后一个正数加到总数T中。
7.如果sum1不等于0,表示输入的结尾类似为19 -1 -2 -3,那么最后剩余的数为temp[cnt]+sum1,将其加到总数T中。
d. 判断是否发生了自然掉落苹果的情况,如果temp[1]+summ不等于temp[cnt],表示自然掉落了苹果,将相应的标记flag[i]置为1。
8.然后,通过遍历1至n-2的树,统计掉落苹果的树的个数D和连续掉落苹果的树的个数E:


9.如果flag[i]等于1,表示第i棵树掉落了苹果,将D加1。
10.如果flag[i]等于1且flag[i+1]等于1且flag[i+2]等于1,表示第i、i+1、i+2棵树连续掉落苹果,将E加1。


11.补全D和E的计数,判断flag[n-1]和flag[n]是否为1,如果是,则将D加1;判断flag[n-1]、flag[n]和flag[1]是否为1,如果是,则将E加1。
12.最后,输出最后苹果总数T、掉落苹果的树的个数D和连续掉落苹果的树的个数E。

#include<bits/stdc++.h>
using namespace std;
int n;
const int N=1005;
int flag[N];//标记是否掉苹果
//int sum1[N];//记录每个正数 
int main(){
	cin>>n;

	int T=0;//最后苹果总数 ->T 
	for(int i=1;i<=n;i++){
		int m;
		cin>>m;
		int tma;//即为aimi,也就是要输入的数 
		int temp[m+5];//记录每个正数 
		int cnt=1;//记录正数个数
		int summ=0;//用来统计第一个正数和最后一个正数之间总共疏果个数 
		int sum1=0;//用来统计每一轮疏果个数(两个正数之间的负数和) 
		cin>>temp[1];
		for(int i=2;i<=m;i++ ){
			cin>>tma;
			if(tma<=0){ //疏果操作 
				sum1+=tma;
			}
			else{    //统计数量(正数) 
				cnt++;
				summ+=sum1;
				sum1=0;
				temp[cnt]=tma; 
			}
		}
		//可以将下面的cout取消注释,查看整个的运行逻辑 
//		cout<<"第一个正数和最后一个正数之间总共疏果个数:"<<summ<<endl;
//		cout<<"最后一轮疏果数:"<<sum1<<endl;
//		cout<<"开始的苹果数"<<temp[1]<<endl;
//		cout<<"开始苹果数-最后一个正数之前总疏果数"<<temp[1]+summ<<endl;
//		cout<<"最后一个正数是"<<temp[cnt]<<endl;
//		cout<<"------------------------------------"<<endl; 
		if(sum1==0){ //表示最后一个输入的数是正数或者一直是0,那么最后剩的数就是最后一个正数 
			T+=temp[cnt]; 
		}
		else{ //表示输入的结尾类似为 19 -1 -2 -3,所以最后剩的数就是temp[cnt]-sum1; 
			T+=(temp[cnt]+sum1);
		}
		int iiii=1;//虚假程序,用来占位,不用管 
		
		if(temp[1]+summ!=temp[cnt]){//自然掉落了苹果 
			flag[i]=1;//表示i这棵树自然掉了苹果 
		}
		
	} 
	int D=0;
	int E=0;
	for(int i=1;i<=n-2;i++){ //只遍历标号为1~n-2的树,那么D,E后面要正常补全 
		if(flag[i]==1){
			D++;//统计掉落苹果的苹果树棵树 
		}
		if(flag[i]==1&flag[i+1]==1&&flag[i+2]==1){
			E++;
		} 
	} 
	
	if(flag[n-1]==1){//补全D 
		D++;
	}
	if(flag[n]==1){
		D++;
	}
	if(flag[n-1]==1&&flag[n]==1&&flag[1]==1){//补全E 
		E++;
	} 
	if(flag[n]==1&&flag[1]==1&&flag[2]==1){
		E++;
	} 
	cout<<T<<" "<<D<<" "<<E;
	cout<<endl;
//	for(int i=1;i<=n;i++){
//		if(flag[i]==1){
//		
//		cout<<"掉苹果的树是"<<i<<" ";
//	} }
	
	return  0;
} 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值