【問題描述】 ios
在一個果園裏,多多已經將全部的果子打了下來,並且按果子的不一樣種類分紅了不一樣的堆。多多決定把全部的果子合成一堆。 ui
每一次合併,多多能夠把兩堆果子合併到一塊兒,消耗的體力等於兩堆果子的重量之和。能夠看出,全部的果子通過n-1次合併以後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。 spa
由於還要花大力氣把這些果子搬回家,因此多多在合併果子時要儘量地節省體力。假定每一個果子重量都爲1,而且已知果子的種類數和每種果子的數目,你的任務是設計出合併的次序方案,使多多耗費的體力最少,並輸出這個最小的體力耗費值。 設計
例若有3種果子,數目依次爲1,2,9。能夠先將1、2堆合併,新堆數目爲3,耗費體力爲3。接着,將新堆與原先的第三堆合併,又獲得新的堆,數目爲12,耗費體力爲12。因此多多總共耗費體力=3+12=15。能夠證實15爲最小的體力耗費值。 code
【輸入文件】blog
輸入文件fruit.in包括兩行,第一行是一個整數n(1n10000),表示果子的種類數。第二行包含n個整數,用空格分隔,第i個整數ai(1ai20000)是第i種果子的數目。 ci
【輸出文件】 it
輸出文件fruit.ans包括一行,這一行只包含一個整數,也就是最小的體力耗費值。輸入數據保證這個值小於231。 io
【樣例輸入】 table
3
1 2 9
【樣例輸出】
15
【數據規模】
對於30%的數據,保證有n1000:
對於50%的數據,保證有n5000;
對於所有的數據,保證有n10000。
900 |
1000 |
4030 |
5000 |
10000 |
10000 |
10000 |
10000 |
10000 |
89471 |
481961 |
485694875 |
1233019094 |
131173003 |
199205993 |
130108340 |
233393206 |
260332759 |
#include<iostream> #include<queue> using namespace std; const int MAXN=20000; struct comp { bool operator()(int &a,int &b) {return a>b;} }; priority_queue<int,vector<int>,comp>heap; long x; int main() { freopen("fruit.in","r",stdin); freopen("fruit.ans","w",stdout); int n; cin>>n; for(int i=0;i<n;i++) { cin>>x; heap.push(x); } long long ans=0; for(int i=0;i<n-1;i++) { if(!heap.empty()){x=heap.top();heap.pop();} if(!heap.empty()){x+=heap.top();heap.pop();} ans+=x;heap.push(x); } cout<<ans<<endl; return 0; }