永发信息网

我编的仅过两组数据,砸错了?更好的方法是啥?

答案:3  悬赏:40  手机版
解决时间 2021-04-27 11:00
  • 提问者网友:锁深秋
  • 2021-04-26 10:28

有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。
  移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
  现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。

  例如 N=4,4 堆纸牌数分别为:
  ① 9 ② 8 ③ 17 ④ 6
  移动3次可达到目的:
  从 ③ 取 4 张牌放到 ④ (9 8 13 10) -> 从 ③ 取 3 张牌放到 ②(9 11 10 10)-> 从 ② 取 1 张牌放到①(10 10 10 10)。
输入格式
N(N 堆纸牌,1 <= N <= 100)
A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000)
输出格式
所有堆均达到相等时的最少移动次数。
样例输入
4
9 8 17 6
样例输出
3

program exa;
var n,i,s:integer;
ave,tot:real;
a:array[1..100] of real;
begin
tot:=0;s:=0;
read(n);
for i:=1 to n do read(a[i]);
for i:=1 to n do tot:=tot+a[i];
ave:=tot/n;
for i:=1 to n-1 do
begin
if a[i]<>0 then a[i+1]:=a[i+1]+a[i]-ave;s:=s+1;
end;
write(s);
end.

最佳答案
  • 五星知识达人网友:污到你湿
  • 2021-04-26 10:33
干吗要用real型?不是存在误差的么?integer可以了,那纸牌是保证能被均分的。直接ave:=tot div n;就行了
全部回答
  • 1楼网友:天凉才是好个秋
  • 2021-04-26 12:19

public class ArrayAVG { public static void main(String args[]){ int iA[]={5,4,3}; int iAvg = sum(iA)/iA.length; int count =0; int iTemp =0; int k=0; for(int i=0,j=iA.length;i<j;i++){ iTemp+=iA[i]; k++; if(iTemp>=iAvg*(i+1)){ count=count+k-1; if(i<j-1){ if(iTemp>iAvg*(i+1)){ iA[i+1]+=(iTemp-iAvg*(i+1)); count++; } } k=0; } } System.out.println(count); } public static int sum(int[] b){ int sum=0; for(int i=0;i<b.length;i++){ sum+=b[i]; } return sum; } }

这是java版的,你看着改一改吧。只提供思路。不理解Q我:30264092

  • 2楼网友:北方的南先生
  • 2021-04-26 12:06

只要看N堆中有几堆是平均数就行了

假定N堆中有n堆是平均数,那么最小次数就是N-n-1

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯