Problem K Length of Bundle Rope

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;
    }
}

posted @ 2020-12-07 19:15  lihaji  阅读(63)  评论(0编辑  收藏  举报