神奇的化合物(優先隊列)

描述

在遙遠的外星球上,所有的化合物都是通過兩個單質元素或者兩個化合物或者一個單質元素一個化合物結合而成,任意的單質元素或者化合物都具有特定的結合能,其中單質元素的結合能是預先固定的,而化合物的結合能則是構成它的兩種物質的結合能之和。兩種物質結合時,需要消耗的能量恰好等於這兩種物質的結合能。

假定有某種化合物是由n種元素化合而成,請問要如何結合才能使得它消耗的能量最低?

比如某化合物由3種單質構成,3種單質的結合能分別是2、4、6,則先將第一種和第二種結合,得到的化合物再與第三種單質結合,所需的總能量爲18,這就是所需的最少能量。

再比如4種單質的結合能分別是5、6、7、8,得到的化合物最少消耗能量爲52

格式

輸入格式

兩行,第一個行爲一個正整數n(2≤n≤1000),表示後面有n種單質。第二行有n個正整數,每個正整數表示一種單質的結合能,所有單質的結合能都小於100。

輸出格式

一行,一個整數,表示由這n個單質構成的化合物所需的最少能量。

樣例

輸入樣例

6
5 12 8 10 4 7

輸出樣例

116

限制

時間限制:100 ms

內存限制:16384 KB

#include<cstdio>
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<cstring>
#include<string>
#include<stack>
#include<map>
#include<queue>
using namespace std;

int main()
{
    priority_queue<int,vector<int>,greater<int> > q;
    int n,a;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&a);
        q.push(a);
    }
    int ans = 0;
    int e,w;
    while(q.size() != 1)
    {
        e = q.top();
        q.pop();
        w = q.top();
        q.pop(); 
        ans += (e+w);
        q.push(e+w);
        //printf("%d %d %d\n",e,w,ans);
    }
    printf("%d",ans);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章