CCF-小明种苹果(续)

本文介绍了一个关于小明在圆形果园中种苹果的问题,涉及到疏果操作和苹果掉落的统计。需要计算操作结束后苹果总数、掉落苹果树的数量以及连续三棵掉落的组数。给出了输入输出格式及样例,并对子任务难度进行了说明。

​​【题目描述】

小明在他的果园里种了一些苹果树,这些苹果树排列成一个圆。为了保证苹果的品

质,在种植过程中要进行疏果操作。为了更及时地完成疏果操作,小明会不时地检查每棵树的状态,根据需要进行疏果。检查时,如果发现可能有苹果从树上掉落,小明会重新统计树上的苹果个数(然后根据之前的记录就可以判断是否有苹果掉落了)。在全部操作结束后,请帮助小明统计相关的信息。

【输入格式】

从标准输入读入数据。

第 1 行包含一个正整数 N,表示苹果树的棵数。

第 1 + i 行(1 ≤ i ≤ N),每行的格式为 m i ,a i1 ,a i2 ,...,a i,m i 。其中,第一个正整数 m i表示本行后面的整数个数。后续的 m i 个整数表示小明对第 i 棵苹果树的操作记录。若a ij (1 ≤ j ≤ m i )为正整数,则表示小明进行了重新统计该棵树上的苹果个数的操作,统计的苹果个数为 a ij ;若为零或负整数,则表示一次疏果操作,去掉的苹果个数是 |a ij |。

输入保证一定是正确的,满足:

1. a i1 > 0,即对于每棵树的记录,第一个操作一定是统计苹果个数(初始状态,此时不用判断是否有苹果掉落);

2. 每次疏果操作保证操作后树上的苹果个数仍为正。

 

 

【输出格式】

输出到标准输出。

输出只有一行,包含三个整数 T、D、E。其中,

• T 为全部疏果操作结束后所有苹果树上剩下的苹果总数(假设每棵苹果树在最

后一次统计苹果个数操作后苹果不会因为疏果以外的原因减少);

• D 为发生苹果掉落的苹果树的棵数;

• E 为相邻连续三棵树发生苹果掉落情况的组数。

对于第三个统计量的解释:N 棵苹果树 A 1 ,A 2 ,...,A N 排列成一个圆,那么 A 1 与A 2 相邻,A 2 与 A 3 相邻,......,A N−1 与 A N 相邻,A N 与 A 1 相邻。如果 A i−1 ,A i ,A i+1这三棵树都发生了苹果掉落的情况,则记为一组。形式化的,有E =?{Ai |Drop(Pred(A i ))∧Drop(A i )∧Drop(Succ(A i ))}??.

其中,Drop(A i )表示苹果树 Ai是否发生苹果掉落的情况,Pred(A i )表示 A i 的前一棵树A i−1 (如果 i > 1)或者 A N (如果 i = 1),Succ(A i )表示 A i 的后一棵树 A i+1 (如果 i < N)或者 A 1 (如果 i = N)。

【样例 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

【样例 1 解释】

全部操作结束后,第 1 棵树上剩下的苹果个数为 74 − 7 − 12 − 5 = 50,第 2 棵为59−4 = 55,第 3 棵为 60−2 = 58,第 4 棵为 59−0 = 59。因此 T = 50+55+58+59 = 222。

其中,第 3 棵树在第 2 次统计之前剩下的苹果个数为 76 − 5 − 10 = 61>60,因此发生了苹果掉落的情况。可以检验其他的树没有这种情况,因此 D = 1。

没有连续三棵树都发生苹果掉落的情况,因此 E = 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

【样例 2 解释】

第 1、2、4、5 棵树发生了苹果掉落的情况,因此 D = 4。其中,连续三棵树都发

生苹果掉落情况的有 (5,1,2) 和 (4,5,1),因此 E = 2。

【子任务】

测试点 N max{m i }

1, 2 3 2

3, 4 10 10

5, 6 10 100

7, 8 100 100

9, 10 1000 1000

• m i ≤ 1000,对所有 1 ≤ i ≤ N

• |a ij | ≤ 10 6 ,对所有 1 ≤ i ≤ N,1 ≤ j ≤ m i

【提示】

• 如果你的程序没有实现统计 D 和 E 的功能,请按照 D = 0,E = 0 输出结果,这样如果 T 的统计正确能够得到一部分分数。

• 如果你的程序没有实现统计 E 的功能,请按照 E = 0 输出结果,这样如果 T 和D 的统计正确能够得到一部分分数。

#include <stdio.h>
struct node {
    long int count;
    int drop;
};
int N, M;
int main() {
    long int temp;
    scanf("%d", &N);
    struct node arr[N + 1];
    for (int i = 1; i <= N; i++) {
        scanf("%d", &M);
        scanf("%d", &temp);
        arr[i].count = temp;
        arr[i].drop = 0;
        for (int j = 2; j <= M; j++) {
            scanf("%d", &temp);
            if (temp > 0) {
                if (arr[i].count != temp) {
                    arr[i].count = temp;
                    arr[i].drop = 1;
                }
            } else
                arr[i].count += temp;
        }
    }
    int n = 0, num = 0, ans = 0;
    for (int k = 1; k <= N; k++) {
        n += arr[k].count;
        if (arr[k].drop)
            num += 1;
    }
    for (int l = 1; l <= N; l++) {
        if (arr[l].drop) {
            if (l == 1 && arr[N].drop && arr[l + 1].drop)
                ans++;
            else if (l == N && arr[l - 1].drop && arr[1].drop)
                ans++;
            else if (arr[l - 1].drop && arr[l + 1].drop)
                ans++;
        }
    }
    printf("%d %d %d", n, num, ans);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值