CCF CSP 20190902 小明种苹果(续) 100分 小明真累

CCF CSP 20190902 小明种苹果(续) 100分 小明真累_第1张图片CCF CSP 20190902 小明种苹果(续) 100分 小明真累_第2张图片

       【题目概述

       小明种苹果(续)相较于第一题难度有了一定的提升,苹果树排列成了一个圆,需要考虑苹果从树上掉落的情况以及处理苹果的疏果操作。

 

       【输入输出

       输入要严格按照题目要求,注意不要输错。最后输出疏果后的剩余的苹果总数T,发生苹果意外掉落的树的棵树D,连续三个树发生苹果掉落情况的组数E。

 

       【思路

       相较于第一题难度,第二题难度有了一定的提升,需要处理的难点有

       1. 正确处理小明重新统计苹果树的情况,并判断是否发生苹果掉落。

       这里可以通过比较第二次之后的mi是否大于0来判断小明是否重新统计了苹果树;判断苹果是否掉落可以与之前的疏果后的苹果总数比较,若不一致则发生苹果掉落。

       2. 判断连续三个树发生苹果掉落情况的组数。

       设置flag,记录所有苹果树发生苹果的掉落情况,然后进行类似flag1^flag2^flag3==1的操作来判断是否连续三个树发生苹果掉落,并记录组数。

 

       具体解释请看代码分析:

#include 
#include 
using namespace std;
//定义苹果数结构体
struct appletree
{
	//记录nums中的数据个数
	int num;
	//记录苹果树疏果后剩余的苹果数
	vector nums;
	//1表示有苹果意外掉落的情况发生,0则表示无掉落情况发生
	bool flag;
};

int main()
{
	//创建苹果树集合
	vector appnums;
	//N为苹果棵树,M表示改行后面需要输入的整数个数
	int N, M;
	cin >> N;
	//疏果后的剩余的苹果总数
	int appsums = 0;
	//发生苹果意外掉落的树的棵树
	int errornum = 0;
	//连续三个树发生苹果掉落情况的组数
	int listnum = 0;

	for (int i = 0; i < N; i++)
	{
		cin >> M;
		appletree appnum;
		appnum.num = 0;
		appnum.flag = 0;
		int mi;
		for (int j = 0; j < M; j++)
		{
			cin >> mi;
			//记录第一次统计苹果树的数量
			if (mi > 0 && appnum.num == 0)
			{
				appnum.nums.push_back(mi);
				appnum.num++;
			}
			//判断是否重新统计,若是则在nums后插入重新统计的数据
			else if (mi > 0 && appnum.num > 0)
			{
				appnum.nums.push_back(mi);
				//判断是否发生掉落情况,若是则flag=1
				if (mi != appnum.nums[appnum.num - 1])
				{
					appnum.flag = 1;
				}
				appnum.num++;
			}
			//处理疏果情况,更新疏果后的苹果数
			else
			{
				appnum.nums[appnum.num - 1] += mi;
			}
		}
		//记录发生苹果意外掉落的树的棵树
		if (appnum.flag == 1)
			errornum++;
		//所有苹果树疏果后的苹果总数
		appsums += appnum.nums[appnum.num - 1];
		appnums.push_back(appnum);//将数据添加到苹果树集合中
	}
	
	//处理连续三个树发生苹果掉落的情况
	for (int i = 0; i < N; i++)
	{
		//当发现flag=1时表示有苹果意外从树上掉落
		if (appnums[i].flag == 1)
		{
			//判断该树的前后是否flag都等于1,若是则listnum++
			if (appnums[(i + 1 + N) % N].flag == 1 && appnums[(i - 1 + N) % N].flag == 1)
			{
				listnum++;
			}
		}
	}

	cout << appsums << " " << errornum << " " << listnum << endl;
	return 0;
}

测试数据集:

测试数据集
输入1:
4
4 74 -7 -12 -5
5 73 -8 -6 59 -4
5 76 -5 -10 60 -2
5 80 -6 -15 59 0
输出1:
222 1 0


输入2:
5
4 10 0 9 0
4 10 -2 7 0
2 10 0
4 10 -3 5 0
4 10 -1 8 0
输出2:
39 4 2

 

你可能感兴趣的:(ccf刷题)