解题思路
-
初始化变量:
- sumApple(总苹果数):这是我们想要计算的所有树上剩余苹果的总数。初始化为0,表示开始时还没有计算任何树的苹果数量。
- dropNum(掉落苹果的树的数量):这个计数器用于记录在整个观察期内,有多少棵树至少掉落过一次苹果。同样初始化为0。
- constantDrop(连续掉落的树的数量):这个计数器用于记录有多少处存在连续三棵树都掉落过苹果。初始化为0。
-
遍历每棵树(每行输入):
- 对于每棵树,首先读取 m(当天的记录数量)和当前苹果总数。
- 使用一个循环来读取这棵树的每一条记录(从第二条记录开始,因为第一条是初始的苹果数)。
- 在每条记录中,检查苹果数是增加还是减少:
- 如果记录为正(ai > 0):这意味着这是一次全新的苹果总数记录。如果这个数与之前跟踪的苹果总数(currentApple)不一致,那么标记这棵树为掉落过苹果(isdrop[i] = 1),并更新 currentApple 为新的总数。
- 如果记录为负(ai < 0):这意味着苹果数量比上次减少了。这种情况下,更新 currentApple(加上减少的数量,因为ai是负数)。
-
更新总苹果数量:在遍历完一棵树的所有记录后,将这棵树当前的苹果总数(currentApple)加到总苹果数(sumApple)上。
-
检查掉落和连续掉落:
- 遍历完所有树后,再次遍历每棵树来检查哪些树掉落了苹果。如果一棵树掉了苹果(isdrop[i]为1),则增加掉落苹果树的数量(dropNum)。
- 同时,检查连续掉落的情况:如果一棵树及其相邻的两棵树(使用模运算来处理边界条件)都掉落过苹果,则增加连续掉落的树的数量(constantDrop)。
-
输出结果:最终,程序输出三个计算结果:总苹果数(sumApple)、掉落苹果树的数量(dropNum)和连续掉落的树的数量(constantDrop)。
完整代码
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <stack>
#include <string>
using namespace std;
int N, mi, a, sumApple, dropNum, constantDrop;
int main()
{
cin >> N;
vector<int> isdrop(N, 0);
for (size_t i = 0; i < N; i++)
{
int currentApple;
cin >> mi >> currentApple;
for (size_t j = 1; j < mi; j++)
{
cin >> a;
if (a>0)
{
if(a!=currentApple) // drop detect
{
isdrop[i] = 1;
currentApple = a;
}
}
else
currentApple += a;
}
sumApple += currentApple;
}
for (size_t i = 0; i < N; i++)
{
int i1 = (i + 1) % N, i2 = (i - 1 + N) % N;
if (isdrop[i]&&isdrop[i1]&&isdrop[i2])
constantDrop++;
if (isdrop[i])
dropNum++;
}
cout << sumApple << " " << dropNum << " " << constantDrop;
return 0;
}