题目
思路
这一题是加强版的小明种苹果。大致思路还是和题目一差不多。边读取边处理。设置一个辅助数组,用以存储该树是否有掉落苹果,方便判断是否有连续三棵树掉落。对于每一棵树,有一个初始化的苹果数量,遇到负值直接加,遇到正值,判断与当前树上剩余苹果数量是否相同,相同则表示没有苹果掉落,继续向下执行,该正值小于当前苹果数,则表示有苹果掉落,更新当前苹果数目,存储该树编号。
代码
代码一(50分)
N = int(input()) # 苹果棵树
T = 0 # 最终剩的苹果总数
D = 0 # 发生苹果掉落的棵数
E = 0 # 相邻连续三棵树发生掉落的组数
is_fall = [0 for i in range(N)] # 记录该树是否有掉落 0 无掉落 1 有掉落
for i in range(0, N):
row = input()
row = row.rsplit()
row = list(map(int, row))
op_num = row[0] # 操作次数
cur_num = row[1] # 当前苹果树的初始数量
flag = False
for x in range(2, op_num+1):
if row[x] < 0:
cur_num += row[x]
elif row[x] > 0:
if cur_num > row[x]: # 说明发生掉落
cur_num = row[x] # 更新苹果数量
flag = True
if flag:
D += 1
is_fall[i] = 1
T += cur_num # 将最终剩余的苹果总数加到T
for y in range(0, N):
if is_fall[y%N] == is_fall[(y+1)%N] == and is_fall[(y+2)%N] == 1:
print(y%N,(y+1)%N, (y+2)%N)
E += 1
print(T, D, E)
个人觉得这个代码是没有问题的,测试案例也过。至于为甚么50分,在下面说一下。
代码二 (100分)
N = int(input()) # 苹果棵树
T = 0 # 最终剩的苹果总数
D = 0 # 发生苹果掉落的棵数
E = 0 # 相邻连续三棵树发生掉落的组数
is_fall = [0 for i in range(N)] # 记录该树是否有掉落 0 无掉落 1 有掉落
for i in range(0, N):
row = input()
row = row.rsplit()
row = list(map(int, row))
op_num = row[0] # 操作次数
cur_num = row[1] # 当前苹果树的初始数量
flag = False
for x in range(2, op_num+1):
if row[x] < 0:
cur_num += row[x]
elif row[x] > 0:
if cur_num > row[x]: # 说明发生掉落
cur_num = row[x] # 更新苹果数量
flag = True
if flag:
D += 1
is_fall[i] = 1
T += cur_num # 将最终剩余的苹果总数加到T
for i in range(len(is_fall)):
pre=i-1
if pre<0:
pre+=len(is_fall)
next=i+1
if next > len(is_fall)-1:
next-=len(is_fall)
if is_fall[pre]==is_fall[i]==is_fall[next]==1:
E+=1
print(T, D, E)
总结
现在对比一下其实可以看到之前的代码为甚么是50分了。代码本来求余来处理环是没有问题。但是我没有考虑到 如果树的数目少于3个,那这样处理是有问题的。当树的数目不够三个时,E = 0 即可。
修改如下 也是100分
if N >= 3: # 苹果树少于三棵时 直接为0
for y in range(len(is_fall)):
if is_fall[y%len(is_fall)] == is_fall[(y+1)%len(is_fall)] == is_fall[(y+2)%len(is_fall)] == 1:
E += 1