• BZOJ 1045: [HAOI2008] 糖果传递



    题目


    1045: [HAOI2008] 糖果传递

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 2036  Solved: 923
    [Submit][Status]

    Description

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

    Input

    小朋友个数n 下面n行 ai

    Output

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

    Sample Input

    4
    1
    2
    5
    4

    Sample Output

    4

    HINT

    数据规模

    30% n<=1000

    100% n<=100000


    题解


    这一道题是数学分析,设a1分给an的糖果为k,且平均数为ave。

    那么总代价为W=|k|+|a1-k-ave|+|a1+a2-k-ave*2|+|a1+a2+a3-k-ave*4|……

    我们记si=a1+a2+……+ai-ave*i,所以可以发现k为s1到sn的中位数时,总代价最小。


    代码


     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 int a[1000001],p[1000001];
     5 long long ans,tot,now,n;
     6 
     7 int main(){
     8     scanf("%d",&n);
     9     for (int i=0;i<n;i++) scanf("%d",&a[i]),tot+=a[i];
    10     tot/=n;
    11     for (int i=1;i<n;i++) p[i]=p[i-1]+tot-a[i];
    12     sort(p,p+n);
    13     now=p[n/2];
    14     for (int i=0;i<n;i++) ans+=abs(p[i]-now);
    15     printf("%lld
    ",ans);
    16     return 0;
    17 }
    View Code


  • 相关阅读:
    freak out用法
    kinda用法
    比较级与最高级
    issue用法
    invite用法
    yet用法
    follow用法
    get用法
    turn up&turn off&turn on用法
    关于document.lastModified属性
  • 原文地址:https://www.cnblogs.com/WNJXYK/p/4065572.html
Copyright © 2020-2023  润新知