NOIP2004 fruit 合併果子

【問題描述】 ios

在一個果園裏,多多已經將全部的果子打了下來,並且按果子的不一樣種類分紅了不一樣的堆。多多決定把全部的果子合成一堆。 ui

每一次合併,多多能夠把兩堆果子合併到一塊兒,消耗的體力等於兩堆果子的重量之和。能夠看出,全部的果子通過n-1次合併以後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。 spa

由於還要花大力氣把這些果子搬回家,因此多多在合併果子時要儘量地節省體力。假定每一個果子重量都爲1,而且已知果子的種類數和每種果子的數目,你的任務是設計出合併的次序方案,使多多耗費的體力最少,並輸出這個最小的體力耗費值。 設計

例若有3種果子,數目依次爲129。能夠先將12堆合併,新堆數目爲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;
}
    
相關文章
相關標籤/搜索