刷题笔记 - 3005.糖果游戏
题目
代码
li = list(map(int,input().strip().split()))
lenth = len(li)
for i in range(lenth):
# 设置当前位置的左右位置
if i>0 and i<lenth-1:
left = i-1
right = i+1
elif i==0:
left = lenth-1
right = i+1
elif i==lenth-1:
left = i-1
right = 0
# 分糖果
li[i] = int(li[i] / 3)
li[left] = li[left] +li[i]
li[right] = li[right] +li[i]
for i in range(lenth):
print('{:>5d}'.format(li[i]),end='')
算法思想
总结本题题意:5 个小朋友以一个环坐下,每个人要将自己的糖果分成 3 份,其中 2 份分别给左右相邻的小朋友,自己留一份,但不足 1/3 的要吃掉,求一轮之后各个小朋友拥有的糖果数量。
最初是计划通过环形链表来实现,但过于复杂,所以通过左右指针来解决这个问题。
首先,通过 if 语句查找每个位置的左右位置,其中首位和末位的需要单独设置。此处要养成良好的编码习惯,将条件符合更多的部分置于前面,将少的置于后面,以减少无用判断的次数。
位置确定之后执行分糖果的操作。实际上,只需要求出当前糖果数量 1/3 的 整数部分(小数部分可看作是要吃掉的多余糖果),同时给左右位置也加上这 1/3 即可。
最后通过循环格式化输出来匹配题目要求的格式。本题代码中所用format格式可查阅 刷题笔记 - 1807.[编程基础]输入输出练习之格式控制 这篇文章。