uva11300-中位数

来源:互联网 发布:网络基础设施建设方案 编辑:程序博客网 时间:2024/06/09 16:51

经过了几场比赛,逐渐意识到自己的基础不是很牢固,很多水题都不会大哭,于是在集训告一段落后我决定开始刷大白书了,打好自己的基础,争取在暑假集训开始前,把大白书上常见的题目都看懂,过一遍。。。

这一题的巧妙之处在于它最后采取了数形结合的方法,转化成了距离最短的和;思想很巧妙。

求中位数的方法可以是快速选择。

#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>using namespace std;typedef long long ll;const int maxn=1e6+5;ll c[maxn];int main(){    int n;    while(~scanf("%d",&n)){        ll temp,sum=0;        c[0]=0;        for(int i=1;i<=n;i++){            scanf("%lld",&temp);            c[i]=c[i-1]+temp;            sum+=temp;        }        ll m=sum/n,M=m;        for(int i=1;i<n;i++){            c[i]-=M;M+=m;        }        sort(c,c+n);        ll x=c[n/2];        ll ans=0;        for(int i=0;i<n;i++){            ans+=abs(c[i]-x);        }        printf("%lld\n",ans);    }    return 0;}


0 0