算法创作|蓝桥杯真题分糖果问题解决方法
问题描述有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:每个小朋友都把自己的糖果分一半给左手边的孩子。一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。反复进行这个游戏,直到所有小朋友的糖果数都相同为止。你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。输入格式:程序首先读入一个整数N(2<N<100),表示小朋友的人数。接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)。输出格式:要求程序输出一个整数,表示老师需要补发的糖果数。解决方案对于这种比较复杂的题目,我们可以将问题拆解。本题可以简化为:(1)每个小朋友将自己的糖果分一半给左边的孩子。(2)给拥有奇数颗糖的孩子补发糖果。(3)判断所有孩子糖果数量是否相等。在写代码时,我们必须先读入孩子的个数,其次判断每个孩子的糖果数,由此计算出这个孩子应该给左边孩子的糖果数量。最后判断奇偶,进行补发糖果并判断孩子的糖果数量是否相等,如果不相等,则反复进行这些步骤。分糖果问题示例代码N = int(input()) # 孩子的个数s = list(map(int, input().split())) # 每个孩子的糖果数ans = sum(s) # 开始总的糖果数a = s[0] // 2 # 上一个孩子给下一个孩子的糖果数while len(s) != s.count(s[0]): # 当每个人糖果数不一样时执行for i in range(N):if i + 1 == N: # 让最后一个孩子的下一个指向第一个孩子i = -1# 分糖果s[i+1], a = s[i+1] + a - s[i+1] // 2, s[i+1] // 2if s[i+1] % 2 != 0: # 奇数时加1s[i+1] += 1ans = sum(s)-ans # 补发的糖果数print(ans)结语这道蓝桥杯真题启示我们下次遇到这类比较复杂的问题时,应该有一种化繁为简的思想,找出问题中的关键之处,并将之向数学问题转化,就如同数学当中解决应用题一样。实际上,算法与编程是工具,设计算法并不是目的,解决实际问题才是目的。以上是编者对这道题目的看法,此道题目可能还有更好的解决方案,除了用python实现之外,还可以用Java实现,欢迎广大读者发挥自己的创造性与创新性,积极挖掘更好的解决方案。实习编辑:衡辉作者:陈鱼 江肖华 冯睿