比如有三堆 2 5 2(n=3)
可以理解为:5先给左2一个,完了再给右2一个
也可以理解为: 第一堆比平均少一,向下一个借一个,ans++,此时第二堆数量--,到了第二堆,比平均多一个,多的给下一堆,也就是最后一堆,ans++,此时操作完成,因为总的数量是n的倍数,所以一定保证操作完成后最后一堆是平均值。
所以总的来说 就是从左到右模拟一遍,更新下一堆的数量即可。
代码如下
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5+5;
int s[maxn];
signed main(){
int n;
while(cin>>n){
int sum=0;
for(int i=0;i<n;i++){
cin>>s[i];
sum+=s[i];
}
sum/=n;
for(int i=0;i<n;i++)s[i]-=sum;
int ans=0;
for(int i=0;i<n-1;i++){
if(s[i]!=0){
s[i+1]+=s[i];
ans++;
}
}
cout<<ans<<endl;
}
return 0;
}
链接:https://ac.nowcoder.com/acm/contest/948/C
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
有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(1<=N<=100),表示有N堆糖果。 接下来一行输入N个整数A1 A2...An,表示每堆糖果初始数,1<=Ai<=10000。
输出描述:
对于每组输入数据,输出所有堆均达到相等时的最少移动次数。
示例1
输入
复制
4 9 8 17 6
输出
复制
3