【题目概述】
小明种苹果(续)相较于第一题难度有了一定的提升,苹果树排列成了一个圆,需要考虑苹果从树上掉落的情况以及处理苹果的疏果操作。
【输入输出】
输入要严格按照题目要求,注意不要输错。最后输出疏果后的剩余的苹果总数T,发生苹果意外掉落的树的棵树D,连续三个树发生苹果掉落情况的组数E。
【思路】
相较于第一题难度,第二题难度有了一定的提升,需要处理的难点有
1. 正确处理小明重新统计苹果树的情况,并判断是否发生苹果掉落。
这里可以通过比较第二次之后的mi是否大于0来判断小明是否重新统计了苹果树;判断苹果是否掉落可以与之前的疏果后的苹果总数比较,若不一致则发生苹果掉落。
2. 判断连续三个树发生苹果掉落情况的组数。
设置flag,记录所有苹果树发生苹果的掉落情况,然后进行类似flag1^flag2^flag3==1的操作来判断是否连续三个树发生苹果掉落,并记录组数。
具体解释请看代码分析:
#include <iostream>
#include <vector>
using namespace std;
//定义苹果数结构体
struct appletree
{
//记录nums中的数据个数
int num;
//记录苹果树疏果后剩余的苹果数
vector<int> nums;
//1表示有苹果意外掉落的情况发生,0则表示无掉落情况发生
bool flag;
};
int main()
{
//创建苹果树集合
vector<appletree> 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