帮忙看一看,还是wa,郁闷了
均分纸牌Time Limit:1000MS Memory Limit:65536K
Total Submit:266 Accepted:113
Description
有 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)。
Input
有多个测试案例,每个测试案例
第1行输入N(N 堆纸牌,1 <= N <= 100)
第2行输入A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000)
如果输入N=0,则表示结束
Output
对每个测试案例,输出一行,内容为使所有堆均达到相等时的最少移动次数。
Sample Input
4
9 8 17 6
0
Sample Output
3
Source
NOIP2002tg
#include<stdio.h>
main()
{
int n;
int sum,ave,i,j,k;
int z,str[101];
while(scanf("%d",&n)!=0)
{
if(n==0)
break;
else
{
sum=0;z=0;
for(i=1;i<=n;i++)
{
scanf("%d",&str[i]);
sum=sum+str[i];
}
ave=sum/n;
if(ave*n==sum)
{
for(i=1;i<=n;i++)
{
if(str[i]>ave)
{
for(j=i-1;j>0;j--)
{
str[j]=str[j]+str[j+1]-ave;
z++;
str[j+1]=ave;
if(str[j]<=ave)
break;
}
if(str[1]>ave)
{
str[i]=str[1];
str[1]=ave;
for(k=i+1;k<=n;k++)
{
str[k]=str[k]+str[k-1]-ave;
z++;
str[k-1]=ave;
if(str[k]<=ave)
break;
}
}
}
}
printf("%d\n",z);
}
}
}
}
帮忙调试一下,也是不能通过!郁闷了