51nod 1110 距离之和最小

51nod 1110 距离之和最小

考虑贪心取中位数,因为中位数到左边的点和右边的点的个数相同,更合理,权值的话可以转化为一个单点,然后没了。

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

int n;
struct ss{
	ll x,w;
}a[100005];

bool cmp(ss g,ss h){
	return g.x<h.x;
}

int main(){
	ios::sync_with_stdio(false);
	cin>>n;
	
	ll mid,sum=0;
	
	for(int i=1;i<=n;i++){
		int x,w;
		cin>>a[i].x>>a[i].w;
		sum+=a[i].w;
	}
	
	sort(a+1,a+n+1,cmp);//排序 
	sum/=2;
	int j;
	for(j=1;a[j].w<=sum;j++){//取中位数 
		sum-=a[j].w;
	}
	ll ans=0;
	for(int i=1;i<=n;i++){
		ans+=(ll)abs(a[j].x-a[i].x)*a[i].w;//计算总值 
	} 
	cout<<ans;
    return 0;
}
posted @ 2024-09-06 15:31  sad_lin  阅读(3)  评论(0编辑  收藏  举报