思路:最优结构为:首先按距离升序对节点排序,然后依次连接第1至n个节点,再在第i个节点与前i-1个节点上添加负权的回边,回边的权值为 d [ j ] − d [ i ] d[j]-d[i] d[j]−d[i],最后求所有边的权值和。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[200005];
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+1+n);
ll ans=a[n];
ll sum=0;
for(ll i=2;i<=n;i++)
{
ans+=sum-(i-1)*a[i];
sum+=a[i];
}
cout<<ans<<endl;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int T;
cin>>T;
while(T--)solve();
return 0;
}