南郵-1076-機器狗組裝費用
阿新 • • 發佈:2019-02-07
機器狗組裝費用
時間限制(普通/Java):1500MS/4500MS 執行記憶體限制:65536KByte總提交:363 測試通過:128
描述
sed同學最近迷上了製造機器狗,購置了大量所需零件,零件可以組裝為一個元件,這些元件或零件又可以組裝為一個大的元件。在製造機器狗中,元件或零件只能兩兩進行組裝,組裝的順序任意。在機器狗中,每個零件都有一個組裝成本,每次組裝一個元件的費用為各個零件組裝成本之和。給定各個零件組裝成本(單位為元),你的任務是幫助sed計算他至少花費多少費用。
輸入
第一行包括一個整數N,表示機器狗零件數(1≤N≤10000)
第二行為N個正整數,表示每個機器狗零件組裝成本(單位為元),整數之間用空格隔開。
輸出
輸出僅一行,即機器狗組裝的最少費用。
注意:輸出部分的結尾要求包含一個多餘的空行。
樣例輸入
10
1 2 3 4 5 6 7 8 9 0
樣例輸出
136
題目來源
“IBM南郵杯”個人賽2009
程式碼:
#include<iostream> #include<list> using namespace std; list<int>A; list<int>::iterator pt; list<int>::iterator pr; int sum,a,n,i,k; int main() { while(scanf("%d",&n)!=EOF) { A.clear(); for(i=0;i<n;i++) { scanf("%d",&a); A.push_back(a); } A.sort();//預設是按升序排列的 sum=0; while(A.size()>1) { pt=A.begin(); pr=A.begin(); pr++; k=((*pr)+(*pt)); sum+=k; A.pop_front(); A.pop_front(); pt=A.end(); pt--; if(*pt<=k) A.push_back(k);//如果比最大數還要大,就將次數插入到連結串列尾 else { for(pt=A.begin();pt!=A.end();pt++) { if((*pt)>k) { A.insert(pt,k);//在*pt指向的位置前插入k break; } } } } cout<<sum<<endl; } return 0; }