题目描述
n个点,d[i]表示i到第一个点的距离,现在加边,可以加负边,使得距离之和最小
思路
1、排序
2、最后一个数位最大值,也是正向最大的代价
然后尽可能多的建立负边
2.1、从距离较远的点到距离较近的点是负边,可以理解为从较远的点到达起点,其中较远到起点之间有多少过程点,就建立多少条较远点到起点的负边,然后再从起点到各个中间点。
ex:0,2,3,4,5
距离为4的点,到0、2、3有三条边,分别为从4到0,从4到2,从4到3,从4到2的点,相当于从4到0再从0到2,
AC代码
#include <bits/stdc++.h>
using namespace std;
#define N 100005
#define ll long long
ll t, n;
ll d[N];
int main()
{
cin >> t;
while (t--)
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> d[i];
}
sort(d, d + n);
ll ans = 0, sum = 0;
for (int i = 0; i < n; i++)
{
ans -= d[i] * i - sum;
sum += d[i];
}
ans += d[n - 1];
cout << ans << endl;
}
//system("pause");
return 0;
}