Python实现201909-2(小明种苹果(续))满分代码,带注释

题目链接

http://118.190.20.162/view.page?gpid=T93 (需要注册才能访问)

思路

  1. 获取数字n
  2. 循环n次
  3. 循环体中:
    1. 获取一行数据,按' '符号切片。 注:列表推导式真香!
    2. 对每一行的第2个数据(index=1)的数,就是当前树所有的苹果。即初始状态
    3. 并从第3个数据(index=2)的数,再对[2:]循环
      1. 如果是 那么是自己采摘,累加到temp_get
      2. 如果是正数,那么是自己数了一遍。如果这时,**初始状态 - temp_get != 当前数,说明有掉落。掉落的数为: 初始状态-temp_get-当前数 **。 并且当前树属于有果子掉落的数
  4. 果子掉落树的数目为:sum(所有的树) - drop_trees.count(-1) # 这个 -1 相当于初始赋值就有的,如果树有果子掉落,那么就把-1变成它的索引
  5. 对 ‘相邻三棵都掉落’ 这种情况,用了一点循环队列的思路,即
从 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))
    
                

posted @ 2020-08-20 21:43  Adam_lxd  阅读(247)  评论(0编辑  收藏  举报