zoukankan      html  css  js  c++  java
  • BZOJ 1045 (UVa 11300) 数学分析 + 结论

    这道题在白书上题解相当详细了。。作个总结。。

    令传递是单向的。。(传递的糖果数量可正可负)

    然后列出了n-1个方程。。

    然后一些奇怪的方程加减消元。。转化成了单变量的极值问题。。

    是这样的。。令Ci=Ai-M(M为最终每个人手中的糖果数量,Ai为初始糖果数量)

    于是ans=|x1| + |x1-C1| + |x1-C2| ... + |x1-C(n-1)|

    注意它的几何意义。。

    在数轴上点出C1...C(n-1)

    不难想到不难证明此时x1应为这些点的中间点——即中位数。。

    可以逼格很高地写一发快速选择。。

    // BZOJ 1045
    
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
     typedef long long LL;
     typedef unsigned long long uLL;
     const int N=1000000+5, INF=0x3f3f3f3f;
    
     #define rep(i,a,b) for (int i=a; i<=b; i++)
     #define uep(i,a,b) for (unsigned i=a; i<b; i++)
     #define dep(i,a,b) for (int i=a; i>=b; i--)
     #define read(x) scanf("%d", &x)
     #define fill(a,x) memset(a, x, sizeof(a))
    
     int n;
     LL M, tot, a[N], C[N], ans;
    
    int main()
    {
    	tot=1;
    	rep(i,1,n) scanf("%lld", &a[i]), tot+=a[i];
    	M=tot/n;
    	C[0]=0;
    	rep(i,1,n-1) C[i]=C[i-1]+a[i]-M; 
    	sort(C, C+n);
    	LL x1=C[n/2], ans=0;
    	rep(i,0,n-1) ans+=abs(x1-C[i]);
    	printf("%lld
    ", ans);
    
    	return 0;
    }
    


  • 相关阅读:
    LiLicense server OR Activation code
    一个比喻讲明Docker是什么
    Linux 系统目录结构说明
    Sublime Text2支持Vue语法高亮显示
    javascript权威指南笔记[6-8]
    javascript权威指南笔记[1-5]
    使用chrome控制台调试js代码
    windows与linux下执行.class(包含main方法)
    linux 命令
    几种常见的编码格式
  • 原文地址:https://www.cnblogs.com/yearwhk/p/5119874.html
Copyright © 2011-2022 走看看