CSP201909-2 小明种苹果(续) (Python)

文章目录

题目

试题编号:201909-2
试题名称:小明种苹果(续)
时间限制:1.0s
内存限制:512.0MB

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

输入格式
  从标准输入读入数据。
  第1行包含一个正整数 N,表示苹果树的棵数。
  第1+i 行(1 ≤ i ≤ N),每行的格式为 mi,ai1,ai2,……,aim。其中,第一个正整数mi表示本行后面的整数个数。后续的mi个整数表示小明对第 i 棵苹果树的操作记录。若 aij(1 ≤ j ≤ mi)为正整数,则表示小明进行了重新统计该棵树上的苹果个数的操作,统计的苹果个数为 aij: 若为零或负整数,则表示一次疏果操作,去掉的苹果个数是|aij|。
  输入保证一定是正确的,满足∶
  1. aij > 0,即对于每棵树的记录,第一个操作一定是统计苹果个数(初始状态,此时不用判断是否有苹果掉落);
  2. 每次疏果操作保证操作后树上的苹果个数仍为正。
  
输出格式
  输出到标准输出。
  输出只有一行,包含三个整数 T、D、E。其中,
  ● T为全部疏果操作结束后所有苹果树上剩下的苹果总数(假设每棵苹果树在最后一次统计苹果个数操作后苹果不会因为疏果以外的原因减少);
  ● D为发生苹果掉落的苹果树的棵数;
  ● E 为相邻连续三棵树发生苹果掉落情况的组数。
  对于第三个统计量的解释∶ N 棵苹果树 A1,A2,…,An排列成一个圆,那么A1与 A2相邻,A2与 A3 相邻,…,AN-1 与AN相邻,AN与A1相邻。如果Ai-1,Ai,Ai+1这三棵树都发生了苹果掉落的情况,则记为一组。形式化的,有在这里插入图片描述
  其中,Drop(Ai)表示苹果树Ai是否发生苹果掉落的情况,Pred(Ai)表示Ai的前一棵树 Ai-1(如果 i >1)或者AN(如果 i = 1),Succ(Ai)表示Ai的后一棵树Ai+1,(如果 i < N)或者Ai(如果 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。
  
子任务
在这里插入图片描述
  ● mi ≤ 1 000,对所有1 ≤ i ≤ N
  ●|aij| ≤ 106,对所有1 ≤ i ≤ N,1 ≤ j ≤ mi
  
提示
  ●如果你的程序没有实现统计D和E的功能,请按照D = 0,E = 0输出结果,这样如果 T 的统计正确能够得到一部分分数。
  ●如果你的程序没有实现统计E的功能,请按照E = 0输出结果,这样如果 T 和 D 的统计正确能够得到一部分分数。

程序代码

# 输入苹果树的棵树
N = int(input())

# 每棵苹果树上的苹果数量列表
apples = []

# 记录每棵苹果树是否发生掉落
drop = [False for i in range(N)]

# 循环输入对每一棵苹果树的操作
for i in range(N):
    # 输入操作建立列表 并去掉首元素
    operations = list(map(int,input().split()))
    operations.pop(0)
    # 记录初始苹果数量
    apple = operations[0]
    # 遍历操作列表
    for operation in operations:
        # 当操作记录>0 (重新统计)
        if operation > 0:
            # 若发生苹果掉落 
            if operation != apple:
                # 记录掉落数组 并更新苹果数量
                drop[i] = True
                apple = operation
        # 当操作记录<0 (疏果操作)
        else:
            apple += operation
    # 将当前苹果树的苹果数量添加至列表
    apples.append(apple)

# 计算苹果总数
T = sum(apples)
print(T,end=" ")

# 计算发生掉落的苹果树棵树
D = drop.count(True)
print(D,end=" ")

# 计算连续相邻三棵发生掉落的组数
E = 0
drop.extend([drop[0],drop[1]]) # 首尾相接
for i in range(N):
    if drop[i] == True and drop[i+1] == True and drop[i+2] == True:
        E += 1
print(E,end=" ")
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anera01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值