历年蓝桥杯Python青少组中/高级选拔赛(STEMA)真题解析 | 2023年1月编程题(9)

学习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
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值