| 题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 失误原因(初次提交分数) |
|---|---|---|---|---|---|
| Balancer | ★☆☆☆☆ | 答案正确 | 100 | 2015-02-23 19:16:20 | 没用lld(1) |
n个火柴盒,每个火柴盒里有根火柴,每次可以从一个火柴盒取出一根火柴到相邻的盒子去,问使得所有火柴盒数量相等的最少移动步数。
目的是把每个火柴盒变成根火柴,而向左移动m根火柴其实相当于向右移动-m根火柴,所以不用考虑左右。而顺序对结果也没有影响,所以就从最左边开始,依次利用每个火柴盒右边的火柴盒,将其火柴达到要求值即可。
(即使右边被移动成负数值也没有关系,等价地调一下顺序会补上的)
| 440B.cpp代码已折叠
展开折叠内容
|
|---|
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<queue>
#include<vector>
using namespace std;
#define f(i,n) for(int i=1;i<=n;++i)
#define fi(i,t,n)for(int i=t;i<=n;++i)
#define fd(i,n) for(int i=n;i>=1;--i)
#define fdi(i,t,n) for(int i=n;i>=t;--i)
#define foreach(i,s) for(typeof(s.begin()) i=s.begin();i!=s.end();++i)
#define rforeach(i,s) for(typeof(s.rbegin()) i=s.rbegin();i!=s.rend();++i)
#define si(n) scanf("%d",&n)
#define dsi(n) int n;scanf("%d",&n)
#define llu unsigned long long
#define lld long long
#define ci const int &
long long n,a[50001],Ans=0,sum=0;//fixed:不能用int,不能用llu//
int main()
{
cin>>n;
f(i,n)
{
cin>>a[i];
sum+=a[i];
}
f(i,n)
{
Ans+=abs(a[i]-sum/n);
a[i+1]+=a[i]-sum/n;
}
cout<<Ans;
}
|