1. 程式人生 > >noj 1076 機器狗組裝費用(優先佇列)

noj 1076 機器狗組裝費用(優先佇列)

機器狗組裝費用

時間限制(普通/Java) : 1500 MS/ 4500 MS          執行記憶體限制 : 65536 KByte
總提交 : 491            測試通過 : 167 

題目描述

sed同學最近迷上了製造機器狗,購置了大量所需零件,零件可以組裝為一個元件,這些元件或零件又可以組裝為一個大的元件。在製造機器狗中,元件或零件只能兩兩進行組裝,組裝的順序任意。在機器狗中,每個零件都有一個組裝成本,每次組裝一個元件的費用為各個零件組裝成本之和。給定各個零件組裝成本(單位為元),你的任務是幫助sed計算他至少花費多少費用。



輸入

第一行包括一個整數N,表示機器狗零件數(1≤N≤10000)

第二行為N個正整數,表示每個機器狗零件組裝成本(單位為元),整數之間用空格隔開。

輸出

輸出僅一行,即機器狗組裝的最少費用。

注意:輸出部分的結尾要求包含一個多餘的空行。

樣例輸入

10
1 2 3 4 5 6 7 8 9 0

樣例輸出

136


解題思路:要求組裝費用最小,每次兩個價值最小的相加,再加入總費用中即可,典型優先佇列,優先佇列預設值大的優先極高,可通過cmp修改優先權。

程式碼如下:

#include <cstdio>
#include <queue>
using namespace std;

struct cmp
{
    bool operator ()(int &a,int &b)
    {
        return a>b;  //值小優先順序高
    }
};

int main()
{
    priority_queue <int ,vector<int>,cmp> q;
    int x,n,i,ans=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&x);
        q.push(x);
    }
    while(q.size()>1)
    {
        int t=q.top();
        q.pop();
        t+=q.top();
        q.pop();
        ans+=t;
        q.push(t);
    }
    printf("%d\n", ans);
    return 0;
}