【CSP试题回顾】201909-2-小明种苹果(续)(优化)

CSP-201909-2-小明种苹果(续)

解题思路

  1. 初始化变量

    • sumApple(总苹果数):这是我们想要计算的所有树上剩余苹果的总数。初始化为0,表示开始时还没有计算任何树的苹果数量。
    • dropNum(掉落苹果的树的数量):这个计数器用于记录在整个观察期内,有多少棵树至少掉落过一次苹果。同样初始化为0。
    • constantDrop(连续掉落的树的数量):这个计数器用于记录有多少处存在连续三棵树都掉落过苹果。初始化为0。
  2. 遍历每棵树(每行输入)

    • 对于每棵树,首先读取 m(当天的记录数量)和当前苹果总数。
    • 使用一个循环来读取这棵树的每一条记录(从第二条记录开始,因为第一条是初始的苹果数)。
    • 在每条记录中,检查苹果数是增加还是减少:
      • 如果记录为正(ai > 0):这意味着这是一次全新的苹果总数记录。如果这个数与之前跟踪的苹果总数(currentApple)不一致,那么标记这棵树为掉落过苹果(isdrop[i] = 1),并更新 currentApple 为新的总数。
      • 如果记录为负(ai < 0):这意味着苹果数量比上次减少了。这种情况下,更新 currentApple(加上减少的数量,因为ai是负数)。
  3. 更新总苹果数量:在遍历完一棵树的所有记录后,将这棵树当前的苹果总数(currentApple)加到总苹果数(sumApple)上。

  4. 检查掉落和连续掉落

    • 遍历完所有树后,再次遍历每棵树来检查哪些树掉落了苹果。如果一棵树掉了苹果(isdrop[i]为1),则增加掉落苹果树的数量(dropNum)。
    • 同时,检查连续掉落的情况:如果一棵树及其相邻的两棵树(使用模运算来处理边界条件)都掉落过苹果,则增加连续掉落的树的数量(constantDrop)。
  5. 输出结果:最终,程序输出三个计算结果:总苹果数(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;
}
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值