解题思路
1.初始化变量和输入数据
appleDropped[]
: 用于记录每棵苹果树是否发生过苹果掉落。数组中的每个元素对应一棵树,如果元素的值为1,则表示该树发生了苹果掉落;如果为0,则表示没有发生掉落。N
: 苹果树的总数。m
,a0
,ai
:m
代表对于每棵苹果树,将会有 m 次观察(或称为天数);a0
是第一次观察时的苹果数量;ai
是后续每次观察的苹果变化量。T
,D
,E
: 分别用于统计总苹果数、发生掉落的树的数量以及连续三棵树都发生掉落的情况的数量。
代码的开始部分通过输入获得苹果树的总数 N
,然后进入主循环,每次循环处理一棵树的信息。在每棵树的循环中,首先输入该树的观察次数 m
和第一次观察的苹果数量 a0
。
2.处理每棵树的数据
对于每棵树,代码通过一个内部循环读取接下来每天的苹果变化量 ai
。这里有两种情况:
- 如果
ai
大于零,表示这是一个实际的苹果数量而不是疏果操作。代码检查这个数量是否与前一天的数量a0
不同。如果不同,标记appleDropped[i]
为1,并更新a0
为当前的苹果数量ai
。 - 如果
ai
小于或等于零,这表示进行了疏果操作,应将a0
增加ai
的值(注意ai
是负数)。
3.统计和输出结果
在处理完所有树之后,代码再次遍历所有的树来统计掉落情况:
- 对于每棵树,如果标记为掉落(
appleDropped[i] == 1
),则D
(掉落的树的数量)增加。 - 同时检查这棵树及其后两棵树是否都标记为掉落。如果是,
E
(连续三棵树都发生掉落的情况的数量)增加。
最后,输出总苹果数 T
,发生掉落的树的数量 D
,以及连续三棵树都发生掉落的情况的数量 E
。
完整代码
#include <iostream>
using namespace std;
bool appleDropped[10000]; // 0-未发生掉落;1-发生掉落
long long N, m, a0, ai, T, D, E;
int main()
{
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> m >> a0;
for (int j = 0; j < m - 1; j++)
{
cin >> ai;
if (ai > 0) // 当前苹果个数-与之前苹果个数比较,检查是否掉落
{
if (ai != a0) // 发生掉落
{
appleDropped[i] = 1;
a0 = ai;
}
}
else // 疏果操作
{
a0 += ai;
}
}
T += a0; // 统计苹果总数
}
for (int i = 0; i < N; i++) // 掉落情况统计
{
if (appleDropped[i]) D++; // 统计发生掉落的果树
if (appleDropped[i] && appleDropped[(i + 1) % N] && appleDropped[(i + 2) % N]) E++; // 连续三个果树都发生掉落
}
cout << T << " " << D << " " << E;
return 0;
}