题目描述: 有N队学生,编号分别为1,2,3,…,n。每队上有若干学生,但学生总数必为n的倍数。可以在任一队上移动若干个学生。 移动的规则是:在编号为1的队上移动学生,只能移到编号为2的队上;在编号为n的队上移动的学生,只能移动到编号为n-1 的队上;其他队上移动的学生,可以移到相邻左边或右边的队上。现在要求找出一种移动方法,用最少的移动次数使每队上的 学生人数一样多。例如:n=3,3队学生分别为:3,4,2则移动一次可以达到目的:从第2队中移动一名学生到第3对中即可 实现每队人数相同。 输入: 要求从标准输入中获得两类数据,值的范围正整数(1~100之间),表示队数和每队人数;第一行输入队数,第二行输入每队 人数,每行多个数值之间空格隔开。 输出: 程序输出需要移动的次数
时间: 2023-05-26 22:03:18 浏览: 156
样例输入:
3
3 4 2
样例输出:
1
样例输入:
4
5 6 7 8
样例输出:
4
解题思路: 首先对每队的人数求和并判断是否能够整除,不能整除直接输出-1; 可以整除时求平均数,判断每队的人数与平均数之差,如果大于0则说明这队的人数要移动一部分到相邻队伍去; 如果小于0说明要从相邻队伍去移动一部分人来填补这个队伍的空缺。 为了使总的移动次数最少,可以先把绝对值最大的差值调整掉,然后再调整第二大的差值,以此类推,直到所有队伍的人数达到平均值。
相关问题
题目描述: 有N队学生,编号分别为1,2,3,…,n。每队上有若干学生,但学生总数必为n的倍数。可以在任一队上移动若干个学生。 移动的规则是:在编号为1的队上移动学生,只能移到编号为2的队上;在编号为n的队上移动的学生,只能移动到编号为n-1 的队上;其他队上移动的学生,可以移到相邻左边或右边的队上。现在要求找出一种移动方法,用最少的移动次数使每队上的 学生人数一样多。例如:n=3,3队学生分别为:3,4,2则移动一次可以达到目的:从第2队中移动一名学生到第3对中即可 实现每队人数相同。
算法思路:
首先求出每队学生的平均数,然后从第一队开始,如果当前队伍的人数大于平均数,则将多出来的学生向相邻的队伍移动。具体移动方法如下:
如果当前队伍是第一队,则将多出来的学生向第二队移动。
如果当前队伍是最后一队,则将多出来的学生向倒数第二队移动。
如果当前队伍是中间任意一队,则将多出来的学生向相邻的队伍中人数不足的那个队伍移动,如果两边队伍人数相等,则向左边移动。
重复以上移动过程,直到每队学生数都等于平均数为止。
算法实现:
C++ 代码
编程 题目描述: 有N队学生,编号分别为1,2,3,…,n。每队上有若干学生,但学生总数必为n的倍数。可以在任一队上移动若干个学生。 移动的规则是:在编号为1的队上移动学生,只能移到编号为2的队上;在编号为n的队上移动的学生,只能移动到编号为n-1 的队上;其他队上移动的学生,可以移到相邻左边或右边的队上。现在要求找出一种移动方法,用最少的移动次数使每队上的 学生人数一样多。例如:n=3,3队学生分别为:3,4,2则移动一次可以达到目的:从第2队中移动一名学生到第3对中即可 实现每队人数相同。 输入: 要求从标准输入中获得两类数据,值的范围正整数(1~100之间),表示队数和每队人数;第一行输入队数,第二行输入每队 人数,每行多个数值之间空格隔开。 输出: 程序输出需要移动的次数
思路:
首先需要算出每队学生人数的平均数,记为avg。然后,对于每队学生人数与平均数的差值,可以计算得出:
- 对于第一队和最后一队,差值只能通过向相邻队伍移动实现,因此只需要考虑相邻两队中的最大值与最小值之间的差值即可。
- 对于中间的队伍,差值可以通过向相邻队伍移动实现,因此只需要考虑相邻两队中较大的差值即可。
最后将这些差值加起来,即为总的移动次数。
代码:
阅读全文