洛谷P2512 [HAOI2008]糖果传递

SLOJ P1117. 糖果传递

SLOJP10010. 「一本通 1.1 练习 6」糖果传递

四中的垃圾OJ到处重复

题目描述

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

输入格式

小朋友个数n,下面nai

输出格式

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

输入输出样例

输入 #1
4
1
2
5
4

 

输出 #1
4

 

说明/提示

对于100%的数据n106

思路:贪心(标签上的东西不抄白不抄)好吧我一开始是没有想明白的,受别的dalao启发,A为每个小朋友的原有糖果数,ave是平均值,X为需要给前一个小朋友的数目,C为相邻两个小朋友糖果数量之差,于是可以得到n个Ai-Xi+Xi+1=ave。

不难想到,最后一个方程可以由前面所有方程联立导出,所以有用的方程有且仅有n-1个。

我们可以将所有方程中的X视为自变量,我们就只用求Xi-Ci的极值便可算出此题的解了。

我们这时候可以与几何联系起来,这个问题即可视为:数轴上给定一些点,找出一个到他们距离之和最小的点,即是本题之解。

其中,不难看出,中位数的距离是最小的,证明可以看这里

#include<bits/stdc++.h>
using namespace std;
int n,a[1500010];
long long c[2000010],sum;
int main(){
    scanf("%d",&n);
    for(int i = 1;i<=n;i++){
        scanf("%d",&a[i]);
        sum+=a[i];
    }
    sum/=n;
    for(int i = 1;i<=n-1;i++)
        c[i] = c[i-1]+a[i]-sum;
    sort(c,c+n);
    int mid = (n-1)/2;
    long long ans = 0;
    for(int i = 0;i<=mid;++i)
        ans+=c[n-i-1]-c[i];
    printf("%lld",ans);
    return 0;
}

注意排序从零开排

综上所述,我是蒟蒻

补充个事,那个样例旁边的复制键是个假的(从洛谷复制题目时不知道怎么把这玩意带上了)

2022-10-26 17:14:55

posted @ 2022-10-26 17:11  cztq  阅读(49)  评论(0)    收藏  举报