https://odzkskevi.qnssl.com/3699857ff0a17d77d1099699cdf4da13?v=1490503337
刚开始读错题意,以为是不变序列,就想着区间dp但数据量肯定会t,,,没想到什么优化方法就放下了,后来队员发现序列是可变的。。。。任意的。。。。。
想着先排序在布拉布拉布拉,一直都没有逆向思维想到哈夫曼。只怪数据结构没认真听啊。。。。
想到哈夫曼树就没什么难的了,因为序列是任意的,每次选两个最小的把他俩合并,再选在合,直到合成一个,就是涂色拆分的逆过程
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
#include<map>
#include<vector>
#include<math.h>
using namespace std;
priority_queue< long long , vector<long long >, greater<long long> >q;
long long int x,y,sum;
int main()
{
int t,n,i;
scanf("%d",&t);
while(t--)
{
while(!q.empty())
q.pop();
sum=0;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%lld",&x),q.push(x);
if(n==1)
{
printf("0\n");
continue;
}
while(q.size()>=2)
{
x=q.top();
q.pop();
y=q.top();
q.pop();
q.push(x+y);
sum+=x+y;
}
printf("%lld\n",sum);
}
return 0;
}