题目
题意:给出T组数据,每组输入n,接下来一行输入n个包裹的大小,用绳子捆绑包裹一次最多捆绑两个包裹,问把这些包裹都捆绑起来最少需要的绳子长度。
思路:思考很长时间没有想出来,其实本质上就是一个优先队列题,可以用哈夫曼或手写优先队列,而用c++priority_queue很简单。
AC代码
#include <bits/stdc++.h>
#include <queue>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
cin>>n;
priority_queue<int,vector<int>,greater<int> >q;//建立小顶堆
while(n--)
{
int x;
cin>>x;
q.push(x);//入队列
}
int sum=0;
int a,b;
while(!q.empty())
{
a=q.top();
q.pop();
if(q.empty())
break;
b=q.top();
q.pop();
sum+=(a+b);
q.push(a+b);
}
cout<<sum<<endl;
}
return 0;
}