3293: [Cqoi2011]分金币
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 854 Solved: 476
[Submit][Status][Discuss]
Description
圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除。每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等。你的任务是求出被转手的金币数量的最小值。
Input
第一行为整数n(n>=3),以下n行每行一个正整数,按逆时针顺序给出每个人拥有的金币数。
Output
输出被转手金币数量的最小值。
Sample Input
1
2
5
4
Sample Output
样例解释
设四个人编号为1,2,3,4。第3个人给第2个人2个金币(变成1,4,3,4),第2个人和第4个人分别给第1个人1个金币。
HINT
N<=<=100000,总金币数<=10^9
Source
1045: [HAOI2008] 糖果传递
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 3115 Solved: 1419
[Submit][Status][Discuss]
Description
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
Input
小朋友个数n 下面n行 ai
Output
求使所有人获得均等糖果的最小代价。
Sample Input
1
2
5
4
Sample Output
HINT
100% n<=987654321
Source
1465: 糖果传递
Time Limit: 2 Sec Memory Limit: 64 MB
Submit: 376 Solved: 177
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1
2
5
4
Sample Output
HINT
数据范围
30%的测试数据, n<=1000.
100%的测试数据, n<=1000000.
ai>=0, 保证ai在longint/int范围内, ai的总和在int64/long long范围内.
Source
Solution
Code
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int n,a[],b[];long long sum,ans;
int main()
{
scanf("%d\n",&n);
for (int i=; i<=n; i++)
scanf("%d",&a[i]),sum+=a[i];
int pj=sum/n;
for (int i=; i<=n; i++)
b[i]=b[i-]+a[i]-pj;
sort(b+,b+n+);
int mid=b[n/+];
for (int i=; i<=n; i++)
ans+=abs(mid-b[i]);
printf("%lld\n",ans);
return ;
}
......丧心病狂......