1. 程式人生 > 實用技巧 >Problem K Length of Bundle Rope

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