CCF认证模拟- 201909-2-小明种苹果(续)-python

题目

在这里插入图片描述

测试用例

4
4 74 -7 -12 -5
5 73 -8 -6 59 -4
5 76 -5 -10 60 -2
5 80 -6 -15 59 0

5
4 10 0 9 0
4 10 -2 7 0
2 10 0
4 10 -3 5 0
4 10 -1 8 0

思路

统计苹果总数:
与苹果数直接相关的数据是每行输入的最后一个正数
如果输入的一行数据中,除前两个以外没有正数,则使用第二个数(苹果数)与后面的负数依次相加
如果输入的一行数据中,除前两个后面还有正数,则使得表示数量的变量等于哪个正数,并与后面的负数相加
统计落果的果树:
这里需要统计的是落果的果树的棵数,所以不能和落果次数所混淆
设置标志位,判断是否落果,最后更具标记位计算
连续落果统计:
题意所给的可以直接想到循环队列的数据结构
这里给出一种简单的思路:
1、首先设置一个list用于存放每颗果树的落果情况,没有落设为0,落果设为1
2、如果list的前两个元素为1,则重新添加到list后面:因为统计时每三个果树连续为1,则算一次落果;只算两个1,是为了避免重复计算
3、为了在list做循环时比较方便,在其后面补两个0,确保即使是最后一位为1,在判断落果时list的index不会超
以样例2为例:
在这里插入图片描述

代码


N = int(input())
list_apple_tree = []
for i in range(N):
    list_tmp = list(map(int, input().split()))
    list_apple_tree.append(list_tmp)

T = 0
D = 0
E = 0
list_D = [0]*N
for tree in list_apple_tree:
    count = tree[1]
    is_D = False
    for i in range(2, tree[0]+1):
        if tree[i] <= 0:
            count = count + tree[i]
        # 这里疏果使用boolean表示,否则进行第二次疏果会多算一颗被疏果的树
        else:
            if count > tree[i]:
                count = tree[i]
                is_D = True
                list_D[list_apple_tree.index(tree)] = 1
    T = T + count
    if is_D:
        D = D + 1

# 循环列表实现比较难,这种思路比较奇葩,但是很简单
for j in range(N):
    if list_D[j] == 1:
        list_D.append(1)
    # 这个地方,如果多于两个,则会进行重复计算
    if list_D[j] == 0 or len(list_D) >= N+2:
        break
list_D.append(0)
list_D.append(0)
for k in range(len(list_D)-2):
    if list_D[k] == 1:
        if list_D[k+1] == 1:
            if list_D[k+2] == 1:
                E = E + 1
print(T, D, E)

posted @ 2020-11-23 22:28  博0_oer~  阅读(27)  评论(0编辑  收藏  举报