zoukankan      html  css  js  c++  java
  • 1045: [HAOI2008] 糖果传递

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 4897  Solved: 2457
    [Submit][Status][Discuss]

    Description

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

    Input

    第一行一个正整数nn<=1'000'000,表示小朋友的个数.
    接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数.

    Output

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

    Sample Input

    4
    1
    2
    5
    4

    Sample Output

    4
     
    毕业被班上委托制作学校录取分布地图。。。没钱拿(눈_눈),我的时间可是10美刀/小时
     
    和均分纸牌类似,以绝对值差为贪心原则
    设每位小朋友有Ai颗糖,若Xi>0表示第i位小朋友向第i-1位小朋友传递Xi颗糖,若Xi<0表示第i-1位小朋友向第i位小朋友传递Xi颗糖
    最终每位小朋友持有ave=(A1+A2...+An)/n颗糖
    则:
    A1-X1+X2=ave——>X2=X1-(A1-ave)=X1-C1——>C1=A1-ave
    A2-X2+X3=ave——>X3=X2-(A2-ave)=X1-C2——>C2=C1+A2-ave
    A3-X3+X4=ave——>X4=X3-(A3-ave)=X1-C3——>C3=C2+A3-ave
    ......
    An-Xn+X1=ave——>Xn=Xn-1-(An-ave)=X1-Cn——>Cn=Cn-1+An-ave
    于是ans=|X1-C1|+|X2-C2|+|X3-C3|+...+|Xn-Cn|
    为了使ans最小,Xi应该最接近Ci的平均数
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 #define LL long long
     8 
     9 const int MAXN=1000005;
    10 
    11 LL n,mid,ave,ans;
    12 LL A[MAXN],C[MAXN];
    13 
    14 int main()
    15 {
    16     cin>>n;
    17     for(int i=1;i<=n;i++)
    18     {
    19         cin>>A[i];
    20         ave+=A[i];
    21     }
    22     ave/=n;
    23     for(int i=2;i<=n;i++)
    24         C[i]=C[i-1]+A[i]-ave;
    25     sort(C+1,C+n+1);
    26     mid=C[n/2+1];
    27     for(int i=1;i<=n;i++)
    28         ans+=abs(C[i]-mid);
    29     cout<<ans<<endl;
    30     return 0;
    31 }
  • 相关阅读:
    CentOS/Ubuntu安装最新的gcc-9
    CentOS 7 源码安装 CMake 3.16.2 最新稳定版。解决 cmake: command not found 问题
    堆排序
    linux可重入、异步信号安全和线程安全
    目录
    教程文档
    推荐文章
    学习文档
    开发工具-索引
    同步/异步/阻塞/非阻塞
  • 原文地址:https://www.cnblogs.com/InWILL/p/9315117.html
Copyright © 2011-2022 走看看