学习Python从娃娃抓起!记录下蓝桥杯备考学习过程中的题目,记录每一个瞬间。
附上汇总贴:历年蓝桥杯Python青少组中/高级选拔赛(STEMA)真题解析 | 汇总
【题目描述】
将N(1<N<50)堆石子围成一个圆圈,已知每堆石子的数量,且石子的总数量能被N整除。请按照如下要求移动石子,使得N堆石子的数量变为相同。
要求:可以从每堆石子中拿取石子移动到它左右相邻的两堆石子堆中。
计算出要使得N堆石子的数量变为相同,至少需要移动多少颗石子。
例如:N=3,3堆石子顺时针方向的数量依次为2、6、7。最少需要移动3颗石子,N堆石子的数量变为相同,每堆5颗。
[图片]
第1次从第二堆石子中拿1颗移动到第一堆的石子中,此时3堆石子的数量依次为3、5、7;
第2次从第三堆石子中拿2颗移动到第一堆的石子中,此时3堆石子的数量依次为5、5、5;
【输入】
第一行输入一个正整数N(1<N<50),表示石子的堆数
第二行输入N个正整数(1<正整数<100),表示顺时针方向每堆石子的原始数量,正整数之间以一个空格隔开
【输出】
输出一个整数,表示要使N堆石子的数量变为相同,最少移动的石子数量,如果原始N堆石子数量相同,则输出0
【输入样例】
3
2 6 7
【输出样例】
3
【代码详解】
n = int(input())
ls = [int(i) for i in input().split()]
avg = sum(ls) // n # 求得平均值
for i in range(n):
if i == 0: # 对于第一堆石子,直接计算其需要移动的石子数(如果为负数,说明从左右移过来)
ls[i] -= avg
else: # 对于其他石子
ls[i] -= avg # 除计算与平均值的差值
ls[i] += ls[i-1] # 再进行前缀和,表示当前石子堆,要移动的石头总数
ls.sort() # 按照从小到大排序
tot = 0 # 初始值设为0
for x in ls: # 遍历前缀和列表
tot += abs(x - ls[n // 2]) # 每个值都去减中间的值,并进行累加
print(tot)
【运行结果】
3
2 6 7
3