Problem K Length of Bundle Rope
题意:给你 n 个箱子的大小 a ,要求把箱子捆成一个单位,每次将两个单位捆在一起消耗长度为两个单位的大小只和的绳子,要求绳子长度最小。
样例解释:
8 5 14 26
题面的样例有毒看了半天。
应该是 27+26=53
每次取出大小最小的箱子捆成一个单位就可以保证消耗最少。
1.8+5=13;
2.13+14=27;
3.27+26=53;
res=13+27+53=93;
可以使用小顶堆解决这类问题。
代码:
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <deque>
#include <cmath>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <ctime>
#include <iomanip>
//#include <unordered_map>
#define INF 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
#define FILL(a,n,v) fill(a,a+n,v)
#define Mset(a,v) memset(a,v,sizeof a)
#define Mcpy(a,b) memcpy(a,b,sizeof b) //a=b
#define fcio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define fcin freopen("/Users/lihaji/Documents/program/XcodeTest/Test/in.txt","r",stdin)
#define fcout freopen("out.txt","w",stdout)
using namespace std;
priority_queue<int,vector<int>,greater<int>>q;
int t;
int n;
int a;
int main()
{
// fcin;
cin>>t;
while(t--)
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a;
q.push(a);
}
int res=0;
while(q.size()>1)
{
int x=q.top();
q.pop();
int y=q.top();
q.pop();
res+=x+y;
q.push(x+y);
}
q.pop();
cout<<res<<endl;
}
}