传递糖果
总时间限制: 1000ms 内存限制: 65536kB
描述
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
输入
共两行
第一行 小朋友个数n
第二行 n个ai用空格隔开
输出
求使所有人获得均等糖果的最小代价。
样例输入
4
1 2 5 4
样例输出
4
提示
贪心
数据规模
30% n<=1000
100% n<=1000000
思路点拔:
1.本题想要达到的目的是:
要想付出最少代价,就让小朋友们一圈就完成均分
2.推理:
<1>.首先要明确:n个小朋友是围成环;
<2>.先取到均值,然后每个数去减掉均值;
===========================================
<3>.找出递推式
{
令均值为m
xn
.an| | a1
. x1
. a2
. x2
. a3
. x3
a5 x4 a4
x2=x1-(m-a1);
x3=x2-((m-a1)-(m-a2))
.
.
.
xn=xn-1-((m-a1)-(m-a2)-…-(m-an-1));
}
=======================================================
<4>找到递推式后,先找到中位数,也就是在数轴中最中间的那个值
用中位数减掉每个数,再取绝对值,然后累加,就得到了最小的代价
========================================================
/*
*/
#include<cstdio>
#include<cmath>
int sum,tot,n,a[1000005],x[1000005];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
sum/=n; //取到均值
x[1]=fabs(a[n]-a[1]);
for(int i=1;i<=n;i++)
{
x[i]=x[i-1]-(sum-a[i-1]); //每个数都减去均值
}
int mid=x[(n+1)/2]; //找出中位数
for(int i=1;i<=n;i++)
{
tot+=fabs(mid-x[i]); //累加每个数与中位数的绝对值
}
printf("%d\n",tot);
return 0;
}
综合性强,再多琢磨琢磨递推式是怎么来的^_^