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;
}