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
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long int ll;
const int SIZE = 1e5 + 5;
int n;
struct Node
{
ll pos;
ll weight;
};
Node input[SIZE];
bool cmp(const Node &a, const Node &b)
{
return a.pos < b.pos;
}
int main()
{
ll sum = 0;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> input[i].pos >> input[i].weight;
sum += input[i].weight;
}
sum >>= 1;
sort(&input[0], &input[n], cmp);
ll temp = 0;
int index = 0;
for (int i = 0; i < n; i++)
{
temp += input[i].weight;
if (temp > sum)
{
index = i;
break;
}
}
ll result = 0;
for (int i = 0; i < index; i++)
{
result += (input[index].pos - input[i].pos) * input[i].weight;
}
for (int i = index+1; i < n; i++)
{
result += (input[i].pos - input[index].pos) * input[i].weight;
}
cout << result << endl;
return 0;
}