小朋友分糖果,本题是2022年3月13日举办的第13届蓝桥杯青少组Python编程选拔赛真题编程部分第4题。有N个小朋友从左到右排成一排,每个小朋友手中都有一定数量的糖果,且糖果总数量是N的倍数。 请编程计算出最少调整几次可以使每个小朋友的糖果数量相同。
先来看看题目的要求吧。
编程实现:
有N个小朋友从左到右排成一排,每个小朋友手中都有一定数量的糖果,且糖果总数量是N的倍数。计算出最少调整几次可以使每个小朋友的糖果数量相同。
调整规则如下:
规则 1:每个小朋友的糖果只能调整到左右相邻的两个小朋友手中;
规则 2:第一个小朋友的糖果只能调整到第二个小朋友手中;
规则 3:最后一个小朋友的糖果,只能调整到倒数第二个小朋友手中。
例如:1~3 号小朋友原有糖果数量分别为6,4,2。
1)1号小朋友拿出两块给2号小朋友;
2)2号小朋友拿出两块给3号小朋友; 两次操作后三个小朋友手中糖果分别为 4,4,4。
即按照调整规则最少操作2次可以使3个小朋友手中糖果数量都相同。
现按照顺序给出1 ~ N号小朋友手中原有糖果数量,按照调整规则计算出最少调整几次可以使小朋友手中的糖果数量都相同。
输入描述:
输入N个正整数(1 < 正整数 < 100),表示1到N号小朋友手中原有糖果数量,正整数之间以一个英文逗号隔开,且所有正整数之和是N的倍数
输出描述:
按照调整规则计算出最少操作几次可以使小朋友手中糖果数量都相同
样例输入:
6,4,2
样例输出:
2
这是一道算法题,涉及的知识点包括循环、条件、列表和模拟算法等。
思路有了,接下来,我们就进入具体的编程实现环节。
代码不少,强调三点:
1). 在遍历每一个小朋友的时候,都需要计算左侧和右侧需要的总糖果数量,直接使用列表的切片运算结合sum()函数即可;
2). 调整的条件有两个,一个是当前糖果数量 > 平均值,二是右侧或左侧还缺少糖果,二者缺一不可;
3). 糖果只能给到左边和右边相邻的小朋友,不能跳过。
至此,整个程序就全部完成了,你可以输入不同的数据来测试效果啦。
循环语句;
条件语句;
列表操作;
枚举算法;
本题代码不少,难度也较大,关键在于如何找到调整糖果的逻辑,我们可以通过举例法,找到其通用规律。
本题涉及到算法有两个,一是枚举算法,二是模拟算法。
枚举算法比较简单,就是使用循环把所有的情况都列举出来进行相应的处理。
模拟算法,就是利⽤计算机对⼀个过程进⾏模拟,并从中得出答案。比如,可以使用计算机模拟抛硬币得到正反面概率的情况,又比如模拟掷骰子、猜数字游戏等。
通常来说,模拟算法并没有固定的套路,具体问题需要具体分析。可以使用有代表性的数据来模拟解决问题的过程,找出其核心逻辑和通用规律。
你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。
需要源码的,可以添加本人微信。
另外,超平老师创建了一个蓝桥杯备考交流群,这是专门为老师和家长打造的免费社群,您可以与来自全国各地的老师、家长共同交流经验,分享学习心得。
超平老师也会给大家带来及时的赛事动态,备考攻略,真题资源分享,帮助各位更好地备考第15届蓝桥杯赛事,力争取得优异的成绩。
扫码或长按加入微信群