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)