さいてきマージもんだい


最適連結問題Time Limit:1000 ms Memory Limit:65536 KiB
Problem Descriptionは、k個の順序付けされたシーケンスs 1,s 2,...,skを与え、このk個のシーケンスを2ウェイマージアルゴリズムで1つのシーケンスにマージする.採用した2パスマージアルゴリズムは,2つの長さがそれぞれmとnのシーケンスをマージするのにm+n−1回の比較が必要であると仮定した.このシーケンスをマージする最適なマージ順序を決定するアルゴリズムを設計し,必要な総比較回数を最小限に抑える.比較のためには、このシーケンスをマージする最悪のマージ順序を決定し、必要な合計比較回数を最も多くする必要があります.所与のk個の集計対象シーケンスについて、最大比較回数と最小比較回数の集計スキームを計算する.
Input入力データの最初の行には1つの正の整数k(k≦1000)があり、k個のマージ対象シーケンスがあることを示す.次の1行には、k個の正の整数があり、k個のマージ対象シーケンスの長さを表す.Outputは2つの整数を出力し,中間をスペースで区切って計算した最大比較回数と最小比較回数を表す.Sample Input 4 5 12 11 2 Sample Output 78 52 Hint Source
#include 

using namespace std;

//        ,            
int findMax(int a[], int k)
{
    priority_queue q;
    for(int i = 0; i < k; i++)
        q.push(a[i]);
    int sum = 0;
    while(q.size() >= 2)
    {
        //               
        int x = q.top();
        q.pop();
        int y = q.top();
        q.pop();
        sum += x + y - 1;  //    
        q.push(x+y);      //              
    }
    return sum;
}

//        ,            
int findMin(int a[], int k)
{
    priority_queue,greater > q;
    for(int i = 0; i < k; i++)
        q.push(a[i]);
    int sum = 0;
    while(q.size() >= 2)
    {
        //               
        int x = q.top();
        q.pop();
        int y = q.top();
        q.pop();
        sum += x + y - 1;  //    
        q.push(x+y);      //              
    }
    return sum;
}

int main()
{
    int k,i;
    int a[1009];
    cin>>k;
    for(i = 0; i < k; i++)
        cin>>a[i];
    int maxx = findMax(a,k);
    int minn = findMin(a,k);
    cout<