【贪心】糖果传递

描述

有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。

输入

第一行一个正整数n≤1000000,表示小朋友的个数.

接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数.

输出

求使所有人获得均等糖果的最小代价。

样例输入

4
1
2
5
4

样例输出

4

题目来源

TZOJ

分析:
1、均分纸牌类型的问题,求经过处理和排序后的数列中位数,再进行累加即可。贪心or模拟。
2、不能用cin输入,scanf勉强过关,会快读最好用快读。
代码:
#include<bits/stdc++.h>
using namespace std;
long long a[1000010],b[1000010],pjs,sum=0,ans=0;
int main()
{
int n;
cin>>n;
for (int i=0;i<n;i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
}
pjs=sum/n;
for (int i=0;i<n;i++)
{
b[i]=b[i-1]+pjs-a[i];//糖果数的差别趋势
}
sort(b,b+n);//从小到大排序
int zws=b[n/2];//中位数
for (int i=0;i<n;i++)
ans+=abs(b[i]-zws);
cout<<ans<<endl;
return 0;
}

发布了122 篇原创文章 · 获赞 0 · 访问量 4673

猜你喜欢

转载自blog.csdn.net/Skynamer/article/details/104137159