noj 1076 機器狗組裝費用(優先佇列)
阿新 • • 發佈:2019-01-25
機器狗組裝費用
時間限制(普通/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; }