解题思路
-
初始化变量:
remainingAppleNum
:用于统计最终剩余的苹果总数。dropApplesTreesNum
:用于统计有苹果掉落的树的数量。adjacentDropsNum
:用于统计连续三棵树都发生苹果掉落的情况的数量。N
:苹果树的总数。drop
:一个布尔数组,用于标记每棵树是否有苹果掉落。
-
遍历每棵树的操作记录:
- 对于每棵树,首先读入操作数量
mi
和第一次统计的苹果个数appleNum
。 - 然后逐个处理后续的操作,区分疏果操作和重新统计苹果个数的操作:
- 疏果操作:当
ai
为零或负数时,累加去掉的苹果个数到thinningNum
。 - 重新统计苹果个数:当
ai
为正数时,比较当前统计的苹果个数与之前(考虑疏果操作后)的苹果个数差异。如果差异不等于疏果去掉的苹果个数,并且是首次发现掉落,则标记该树发生了苹果掉落,更新有苹果掉落的树的数量,并记录首次掉落。
- 疏果操作:当
- 对于每棵树,首先读入操作数量
-
统计最终剩余的苹果总数:在遍历每棵树的过程中,更新
remainingAppleNum
为所有树上剩余苹果的总和。 -
统计连续三棵树都发生苹果掉落的情况:遍历每棵树(循环数组),检查它及其相邻的两棵树是否都标记为发生了苹果掉落,如果是,则
adjacentDropsNum
加一。
#include <iostream>
using namespace std;
int main()
{
int remainingAppleNum = 0, dropApplesTreesNum = 0, adjacentDropsNum = 0, N;
cin >> N; // 苹果树棵树
bool* drop = new bool[N]; // 是否掉落
for (int i = 0; i < N; i++)
{
drop[i] = 0;
}
for (int i = 0; i < N; i++)
{
int mi, appleNum, thinningNum = 0, firstDrop = 0;
cin >> mi >> appleNum;
for (int j = 1; j < mi; j++)
{
int ai;
cin >> ai;
// 疏果操作
if (ai <= 0)
{
thinningNum += abs(ai);
}
// 重新统计苹果个数
else
{
int delta = abs(appleNum - ai);
// 发生掉落(首次)
if ((delta != thinningNum) && (firstDrop == 0))
{
drop[i] = 1;
dropApplesTreesNum++, firstDrop++;
}
// 更新苹果个数,清零疏果个数
appleNum = ai, thinningNum = 0;
}
}
remainingAppleNum += (appleNum - thinningNum);
}
// 相邻连续三棵树发生苹果掉落
for (int i = 0; i < N; i++)
{
int iPre = (i - 1 + N) % N, iSucc = (i + 1 + N) % N;
if (drop[iPre] && drop[i] && drop[iSucc])
{
adjacentDropsNum++;
}
}
cout << remainingAppleNum << " " << dropApplesTreesNum << " " << adjacentDropsNum;
delete[]drop;
return 0;
}