基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注
X轴上有N个点,每个点除了包括一个位置数据X[i],还包括一个权值W[i]。点P到点P[i]的带权距离 = 实际距离 * P[i]的权值。求X轴上一点使它到这N个点的带权距离之和最小,输出这个最小的带权距离之和。
Input
第1行:点的数量N。(2 <= N <= 10000) 第2 - N + 1行:每行2个数,中间用空格分隔,分别是点的位置及权值。(-10^5 <= X[i] <= 10^5,1 <= W[i] <= 10^5)
Output
输出最小的带权距离之和。
Input示例
5 -1 1 -3 1 0 1 7 1 9 1
Output示例
20
emmmm上一次是给定一个三维的坐标让求最短路的,他们之前的共享没有任何联系,直接排一下序就行,而这一次不一样了因为还要乘以他的权值,挑的数尽量的小而且权值乘的也尽量小,这个就比较给力了。。。。。但是权值不久相当于几个数相加的结果么。。。。然后把权值加起来/2找到中位数,把数从小到大排一下序,就ok了
#include <iostream>
#include<algorithm>
#define ll long long
using namespace std;
struct node
{
ll a;
ll b;
}ac[10005];
bool cmp(node a,node b)
{
return a.a<b.a;
}
int main()
{
ll n,sum=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>ac[i].a>>ac[i].b;
sum+=ac[i].b;
}
sort(ac,ac+n,cmp);
sum/=2;
ll ans,temp;
for(int i=0;i<n;i++)
{
ans+=ac[i].b;
if(ans>sum)
{
temp=ac[i].a;
break;
}
}
ll qaq=0;
for(int i=0;i<n;i++)
{
qaq+=abs(ac[i].a-temp)*ac[i].b;
}
cout<<qaq<<endl;
return 0;
}