zoukankan      html  css  js  c++  java
  • bzoj1045题解

    【解题思路】

      (数据范围劝退?正确范围应该是n≤1000000)

      设xi表示第i个小朋友给第i+1个小朋友的糖果数(特殊的,xn表示第n个小朋友给第1个小朋友的糖果数),Â表示平均糖果数,有如下方程组:

    •ai-xi+xi-1=Â(i∈[2,n]∩N)

    •a1-x1+xn

      于是可整理为:

    •x2=a1+x1

    •x3=a2+x2-Â=a1+a2+x1-2Â

    ...

    •xn=an-1+xn-1-Â=...=a1+a2+...+an-1+x1-(n-1)Â

      设sn=nÂ-∑ai(i∈[1,n]∩N),可整理为:

    •x2=x1-s1

    •x3=x1-s2

    ...

    •xn=x1-sn-1

      而答案表达式为∑|xi|(i∈[1,n]∩N),展开即|x1|+∑|x1-si-1|(i∈[2,n]∩N),显然达到最小值时x1值为所有si及0的中位数。复杂度O(nlog2n)。

    【参考代码】

     1 #pragma GCC optimize(2)
     2 #include <algorithm>
     3 #include <cstdio>
     4 #define REP(i,low,high) for(register int i=(low);i<=(high);i++)
     5 using namespace std;
     6 static int n; long long a[1000010],s[1000010];
     7 int main()
     8 {
     9     scanf("%d",&n);
    10     long long ave=0ll; REP(i,1,n) scanf("%lld",a+i),ave+=a[i];
    11     ave/=n,s[n]=0ll; REP(i,1,n-1) s[i]=s[i-1]+a[i]-ave; sort(s+1,s+n+1);
    12     long long m=n&1?s[n+1>>1]:s[n>>1]+s[n+2>>1]>>1,ans=0ll;
    13     REP(i,1,n) ans+=llabs(m-s[i]); return printf("%lld
    ",ans),0;
    14 }
    View Code
  • 相关阅读:
    sessionStorage用于分页,瀑布流和存储用户数据等
    js瀑布流
    sql 日结
    js 去除html标签
    c# 去除文本的html标签
    jQuery 数据滚动(上下)
    jQuery 图片随滚动条滚动加载
    sql 指定范围 获取随机数
    js 时间格式化
    js自写字符串 append 方法
  • 原文地址:https://www.cnblogs.com/spactim/p/6511961.html
Copyright © 2011-2022 走看看