测评机: Virmain[1]
得分: 0分
提交日期: 2013-10-10 20:47:00
有效耗时: 该状态没有记录
编译错误:
//RQNOJ:UserCode\994229.cpp: In function `void distribute(int*, int, int)’:
//RQNOJ:UserCode\994229.cpp:33: error: `count’ undeclared (first use this function)
//RQNOJ:UserCode\994229.cpp:33: error: (Each undeclared identifier is reported only once for each function it appears in.)
//RQNOJ:UserCode\994229.cpp: In function `int main()’:
//RQNOJ:UserCode\994229.cpp:64: error: `count’ undeclared (first use this function)
//RQNOJ:UserCode\994229.cpp:65:2: warning: no newline at end of file
贴出代码:
#include<iostream>
using namespace std;
#define MAXN 100 //N的最大值
int A_ave=0; //平均每堆的牌数
int count=0; //统计移动纸牌的次数
//找出纸牌数最多的堆,返回最大堆的索引
int find_max(int *A ,int beg, int end)
{
//beg和end分别是搜索的起点和终点
int max = beg;
for(int i=beg; i<=end; ++i)
if(A[i] > A[max])
max = i;
return max;
}
//-----分配纸牌-----
void distribute(int *A ,int a ,int b)
{
//a和b分别是函数作用的起点和终点
if(a==b)
return;
int left_lack=0,right_lack=0;
int max = find_max(A,a,b); //找出最大堆
if(max != a)
{
for(int i=a; i<=max-1; ++i) //计算最大堆左边一共缺多少张纸牌
left_lack += A_ave-A[i];
if(left_lack)
++count;
}
if(max != b)
{
for(int i=max+1; i<=b; ++i) //计算最大堆右边一共缺多少张纸牌
right_lack += A_ave-A[i];
if(right_lack)
++count;
}
A[max] = A[max]-left_lack-right_lack; //最大堆分出纸牌后的牌数
A[max-1] += left_lack; //最大堆左边增加牌数
A[max+1] += right_lack; //最大堆右边增加牌数
if(a!=max)
distribute(A,a,max-1);
if(b!=max)
distribute(A,max+1,b);
return;
}
int main()
{
int A_sum=0;
int N,A[MAXN];
cin>>N;
for(int i=0; i<N; ++i)
{
cin>>A[i];
A_sum += A[i];
}
A_ave = A_sum/N;
distribute(A,0,N-1); //分牌
cout<<count<<endl;
}