题目链接:https://vjudge.net/problem/Gym-101257H
题意:有n个集合,每次操作你能合并相邻的两个集合,并得分,分数的计算规则为每个集合最大值的和,尽可能的使得最后的得分最大
解析:如果把合并可以理解为,把最小值删掉的话,那么每次最优的操作就是删掉最小值,那么直接排个序,求个和,每次减掉最小值就好了
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int maxn = 2*1e5+100;
int a[maxn];
int main(void)
{
int n;
scanf("%d",&n);
long long sum = 0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum += a[i];
}
sort(a,a+n);
long long ans = 0;
for(int i=0;i<n;i++)
{
sum -= a[i];
ans += sum;
}
printf("%I64d\n",ans);
return 0;
}