传递糖果(贪心+递推)

传递糖果
总时间限制: 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;
}

综合性强,再多琢磨琢磨递推式是怎么来的^_^

猜你喜欢

转载自blog.csdn.net/qq_42995099/article/details/81813071
今日推荐