刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

编程实现:

将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

使用微信搜索喵呜刷题,轻松应对考试!

答案:

```pythondef min_moves(N, stones):total = sum(stones)target = total // Nmoves = 0curr = 0for stone in stones:curr += stone - targetif curr > 0:moves += currcurr = 0elif curr < 0:moves += abs(curr)return movesN = int(input())stones = list(map(int, input().split()))print(min_moves(N, stones))```

解析:

【喵呜刷题小喵解析】:

这个问题可以通过模拟来解决。首先,我们计算每堆石子的目标数量,即总数量除以堆数。然后,我们遍历每堆石子,计算当前堆的石子数量与目标数量的差值,并将差值累加到移动次数中。如果差值大于0,表示需要移动石子到相邻的堆中,移动次数增加差值;如果差值小于0,表示需要移动石子从相邻的堆中过来,移动次数增加差值的绝对值。最后,返回移动次数即可。

在Python中,我们可以定义一个函数min_moves,接受堆数N和每堆石子的数量列表stones作为参数,返回移动次数。在函数中,我们首先计算总数量和目标数量,然后遍历每堆石子,计算移动次数,最后返回移动次数。在主程序中,我们读取输入,调用min_moves函数,并输出结果。
创作类型:
原创

本文链接:编程实现: 将N(1<N<50)堆石子围成一个圆圈,已知每堆石子的数量,且石子的总数量能被N整除。请

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share