Uva 11300 By ACReaper

来源:互联网 发布:房子夕晒软件 编辑:程序博客网 时间:2024/05/17 21:56

这道题真的是太妙了!模型的转化,建立确实重要!学习了。


定理

1.对于线段上的点,其中点到所有点的距离之和为最短。

证明:

点数为偶数,则在中间两点见的任意位置移动,距离都不变!(可取偏左,偏右都一样)

       点数为奇数,则中间点本来就存在,改点即为中间点


某型的建立:设xi表示第i点给第i - 1点的金币。则最小金币数即是|x1| + |x2| + .... + |xn|


代码如下:

#include <cstdio>#include <algorithm>using namespace std;#define MAXN 1000000 + 10long long A[MAXN];long long C[MAXN];int n;       int main(){while(scanf("%d",&n) != EOF){long long tot =0;for(int i = 1; i <= n; i++){scanf("%lld", A + i);tot += A[i];}long long M = tot / n;C[0] = 0;for(int i = 1; i < n; i++){C[i] = C[i - 1] + A[i] - M;}sort(C,C + n);long long ans = 0,o = C[n / 2];for(int i =  0; i < n; i++){ans += abs(C[i] - o);}printf("%lld\n",ans);}return 0;}

By ACReaper

2013 05 06


原创粉丝点击