CCF-CSP C/C++ 201909-2 小明种苹果(续) 题解

Posted DonquixoteXXXXX

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF-CSP C/C++ 201909-2 小明种苹果(续) 题解相关的知识,希望对你有一定的参考价值。

CCF-CSP C/C++ 201909-2 小明种苹果(续) 题解

一、题目描述

1、背景

小明在他的果园里种了一些苹果树,这些苹果树排列成一个圆。

为了保证苹果的品质,在种植过程中要进行疏果操作。

为了更及时地完成疏果操作,小明会不时地检查每棵树的状态,根据需要进行疏果。

检查时,如果发现可能有苹果从树上掉落,小明会重新统计树上的苹果个数(然后根据之前的记录就可以判断是否有苹果掉落了)。

在全部操作结束后,请帮助小明统计相关的信息。

2、输入格式

第 1 行包含一个正整数 N,表示苹果树的棵数。

第 1+i 行( 1≤i≤N),每行的格式为 mi,ai1,ai2,…,aimi。其中,第一个正整数 mi 表示本行后面的整数个数。后续的 mi 个整数表示小明对第 i 棵苹果树的操作记录。若 aij(1≤j≤mi) 为正整数,则表示小明进行了重新统计该棵树上的苹果个数的操作,统计的苹果个数为 aij;若为零或负整数,则表示一次疏果操作,去掉的苹果个数是 |aij|。

输入保证一定是正确的,满足:

ai1>0,即对于每棵树的记录,第一个操作一定是统计苹果个数(初始状态,此时不用判断是否有苹果掉落);
每次疏果操作保证操作后树上的苹果个数仍为正。

3、输出格式

输出只有一行,包含三个整数 T、D、E。其中,

T 为全部疏果操作结束后所有苹果树上剩下的苹果总数(假设每棵苹果树在最后一次统计苹果个数操作后苹果不会因为疏果以外的原因减少);
D 为发生苹果掉落的苹果树的棵数;
E 为相邻连续三棵树发生苹果掉落情况的组数。
对于第三个统计量的解释:N 棵苹果树 A1,A2,…,AN 排列成一个圆,那么 A1 与 A2 相邻,A2 与 A3 相邻,…,AN−1 与 AN 相邻,AN 与 A1 相邻。如果 Ai−1,Ai,Ai+1 这三棵树都发生了苹果掉落的情况,则记为一组。形式化的,有

4、数据范围

mi≤1000 ,对于所有 1≤i≤N。
|aij|≤106,对于所有 1≤i≤N,1≤j≤mi。

5、样例

输入样例1:

5
4 10 0 9 0
4 10 -2 7 0
2 10 0
4 10 -3 5 0
4 10 -1 8 0

输出样例1:

39 4 2

样例1解释

第 1、2、4、5 棵树发生了苹果掉落的情况,因此 D=4。

其中,连续三棵树都发生苹果掉落情况的有 (5,1,2) 和 (4,5,1),因此 E=2。

二、代码

#include<stdio.h>

int main()

	int n;
	scanf("%d",&n);

	int i,j;
	int applesum=0;//苹果一共还剩下多少 
	int badtrees=0;//自己掉落的树的总个数 
	
	int dropsituation[n+1]=0;//记录每个果树掉落情况,0未掉落,1掉落 
	
	for(i=1;i<=n;i++)
		int m;
		scanf("%d",&m);

		int eachhumandosum=0;//每个果树人为去果的总个数 
		bool badflag=true;//给一个判断标志,防止在一颗果树中增加badtrees两次 
		for(j=1;j<=m;j++)
			int eachnum;
			int recordfirst;
			scanf("%d",&eachnum);
			
			if(j==1)
				applesum+=eachnum;
				recordfirst=eachnum;
			//	printf("applesum:%d recordfirst:%d\\n",applesum,recordfirst);
			
			else
				if(eachnum<=0)
					eachhumandosum+=eachnum;	
					applesum+=eachnum;
				//	printf("eachhumandosum:%d applesum:%d\\n",eachhumandosum,applesum);
				
				else
					 if(recordfirst+eachhumandosum>eachnum)
					 	if(badflag)
					 		badtrees++;
					 		badflag=false;
					 	
				    	
					    dropsituation[i]=1; 
						applesum=applesum-recordfirst-eachhumandosum+eachnum;
					
						recordfirst=eachnum;
						eachhumandosum=0;
				//	printf("badtrees:%d applesum:%d\\n",badtrees,applesum);				
							
				
								
			
			
				
	 
	
	int threenum=0;
	if(dropsituation[1]==1&&dropsituation[2]==1&&dropsituation[n]==1)
			threenum++;		
		
	if(dropsituation[1]==1&&dropsituation[n]==1&&dropsituation[n-1]==1)
			threenum++;		
			
	for(i=2;i<n;i++)		
		if(dropsituation[i]==1&&dropsituation[i-1]==1&&dropsituation[i+1]==1)
			threenum++;
					
		
			
	
	printf("%d %d %d",applesum,badtrees,threenum);
	return 0;


以上是关于CCF-CSP C/C++ 201909-2 小明种苹果(续) 题解的主要内容,如果未能解决你的问题,请参考以下文章

CCF-CSP C/C++ 201903-1 小中大 题解

CCF-CSP C/C++ 201912-1 报数 题解

CCF-CSP C/C++ 202009-2 风险人群筛查 题解

CCF-CSP C/C++ 201909-1 小明种苹果 题解

CCF-CSP C/C++ 201912-2 回收站选址 题解

CCF-CSP C/C++ 202009-1 称检测点查询 题解