题目描述
有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:每个小朋友都把自己的糖果分一半给左手边的孩子。
一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。输入
程序首先读入一个整数N(2< N< 100),表示小朋友的人数。接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)输出
要求程序输出一个整数,表示老师需要补发的糖果数。样例输入
3 2 2 4样例输出
4
# 这波我愿称之为左手倒右手,以防止数据混乱,当然也可以加入t
n = int(input())
lists1 = list(map(int, input().split()))
lists2 = [i for i in lists1]
count = 0
while max(lists1) != min(lists1):
for i in range(len(lists1)):
lists2[i] = lists1[i - 1] // 2 + lists1[i] // 2
if lists2[i] % 2 != 0:
lists2[i] += 1
count += 1
for i in range(len(lists2)):
lists1[i] = lists2[i-1] // 2 + lists2[i] // 2
if lists1[i] % 2 != 0:
lists1[i] += 1
count += 1
print(count)
除了向代码中的max(lists1) != min(lists1),也就是列表中的最大值等于最小值这种算法以外,还可以使用len(set(lists1))>1,也就是集合lists1的长度大于1,高中数学告诉我们,集合就是不能重复,所以当集合lists1只有一个值时,整个列表数字就一样大。