さいてきマージもんだい
1694 ワード
最適連結問題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
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<