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

    我们令$x_i$表示第$i$个人传递给第$i + 1$个人的糖果数量,那么有:

    $$x_n - x_1 = overline{a} - a_1$$

    $$x_1 - x_2 = overline{a} - a_2$$

    $$cdots$$

    $$x_{n - 1} - x_n = overline{a} - a_n$$

    那么求等式两边求前缀和有:

    $$x_n - x_i = sumlimits_{j = 1}^i overline{a} - a_j$$

    移项有:

    $$x_i = x_n - (sumlimits_{j = 1}^i overline{a} - a_j)$$

    我们发现答案等于:

    $$ans = sumlimits_{i = 1}^n |x_i| = sumlimits_{i = 1}^n (x_n - sumlimits_{j = 1}^i overline{a} - a_j)$$

    我们令$s_i = sumlimits_{j = 1}^i overline{a} - a_j$

    我们发现$x_n$的取值最大为所有$a_i$之和

    那么易得,$x_n$取值为$s_i$的中位数答案最优

     1 #include <bits/stdc++.h> 
     2 using namespace std;
     3 
     4 #define ll long long
     5 #define N 1000010
     6 int n;
     7 ll a[N];
     8 
     9 void Run()
    10 {
    11     while (scanf("%d", &n) != EOF)
    12     {
    13         ll sum = 0;
    14         for (int i = 1; i <= n; ++i)
    15             scanf("%lld", a + i), sum += a[i];
    16         sum /= n;
    17         for (int i = 1; i <= n; ++i)
    18         {
    19             ll t = sum - a[i];
    20             a[i] = a[i - 1] + t;
    21         }
    22         sort(a + 1, a + 1 + n);
    23         ll t = a[n / 2];
    24         ll ans = 0;
    25         for (int i = 1; i <= n; ++i)
    26             ans += abs(t - a[i]);
    27         printf("%lld
    ", ans);
    28     }
    29 }
    30 
    31 int main()
    32 {
    33     #ifdef LOCAL
    34         freopen("Test.in", "r", stdin);
    35     #endif 
    36 
    37     Run();
    38     return 0;
    39 }
    View Code
  • 相关阅读:
    路由系统
    flask_sqlalchemy的使用
    input()输入语句
    注释
    Python 2017.1.5
    关于object网页播放器参数的设置,推荐博客系列
    LRU缓存,大神写的,值得借鉴
    object,网页播放器的相关属性设置
    js的apply和call方法
    count()函数在count()中参数的讨论
  • 原文地址:https://www.cnblogs.com/Dup4/p/10573043.html
Copyright © 2011-2022 走看看