LG2512/BZOJ1045 「HAOI2008」糖果传递 中位数

问题描述

LG2512

BZOJ1045


题解

这是一个链状问题的环状版本。

问题最终变为给定数轴上的\(n\)个点,找出一个到他们的距离之和尽量小的点,而这个点就是这些数中的中位数。

网络流24题的负载平衡问题是双倍经验


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std;

template <typename Tp>
void read(Tp &x){
	x=0;char ch=1;int fh;
	while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
	if(ch=='-'){
		fh=-1;ch=getchar();
	}
	else fh=1;
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();
	}
	x*=fh;
}

#define int long long

const int maxn=1000000+7;
int n,a[maxn],s[maxn];
int ans,sum;
signed main(){
	read(n);
	for(int i=1;i<=n;i++) read(a[i]),sum+=a[i];
	sum/=n;
	for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i]-sum;
	sort(s+1,s+n+1);
	for(int i=1;i<=n;i++) ans=ans+(abs(s[n/2+1]-s[i]));
	printf("%lld\n",ans);
	return 0;
}
posted @ 2019-09-19 23:56  览遍千秋  阅读(148)  评论(0编辑  收藏  举报