Python实现201909-2(小明种苹果(续))满分代码,带注释
题目链接
http://118.190.20.162/view.page?gpid=T93 (需要注册才能访问)
思路
- 获取数字n
- 循环n次
- 循环体中:
- 获取一行数据,按' '符号切片。 注:列表推导式真香!
- 对每一行的第2个数据(index=1)的数,就是当前树所有的苹果。即初始状态
- 并从第3个数据(index=2)的数,再对[2:]循环
- 如果是 那么是自己采摘,累加到temp_get
- 如果是正数,那么是自己数了一遍。如果这时,**初始状态 - temp_get != 当前数,说明有掉落。掉落的数为: 初始状态-temp_get-当前数 **。 并且当前树属于有果子掉落的数
- 果子掉落树的数目为:sum(所有的树) - drop_trees.count(-1) # 这个 -1 相当于初始赋值就有的,如果树有果子掉落,那么就把-1变成它的索引
- 对 ‘相邻三棵都掉落’ 这种情况,用了一点循环队列的思路,即
从 index=0 遍历到 n,分别求当前index的下一个,当前index的下两个
当前index的下一个 = index+1
当前index的下两个 = index+2
这样求普通情况还行,如果index=n-1时, index的下两个= index+2(超出n的范围),使用求余的思想即:ndex的下两个= (index+2)%n
// 举例:
n = 5 (index从 0->4 )
index = 3
index的下一个 = index+1 = 4 = n
index的下两个 = (index+2) % 5 = 0
从而达到循环的目的
完整代码如下
n = int(input())
T = 0 # 树上剩余苹果
D = 0 # 掉落苹果的树的数量
E = 0 # 相邻三棵都掉落
drop_trees = []
for i in range(n):
drop_trees.append(-1)
line = [int(a) for a in input().split(' ')]
first_count = line[1]
temp_get = 0
temp_drop = 0
for q in line[2:]:
if q <= 0:
temp_get += abs(q)
elif q > 0:
# 如果firstcount - get 等于 q 说明没掉 否则 掉的就是firstcount - get - q
temp_drop += 0 if first_count-temp_get == q-temp_drop else first_count-temp_get-q-temp_drop
if not first_count-temp_get == q:
drop_trees[i] = i
T += (first_count-temp_get-temp_drop)
'''print(first_count)
print(temp_get)
print(temp_drop)'''
D += len(drop_trees)-drop_trees.count(-1)
if D >=3:
for i in range(n):
right_one = i+1 if i+1<len(drop_trees) else (i+1)%n
right_two = i+2 if i+2<len(drop_trees) else (i+2)%n
if not -1 in [drop_trees[i],drop_trees[right_one], drop_trees[right_two]]:
E+=1
print('{}{}{}{}{}'.format(T,' ',D,' ',E))