給定k 個排好序的序列s1 , s2,……, sk , 用2 路合併演算法將這k 個序列合併成乙個序列。假設所採用的2 路合併演算法合併2 個長度分別為m和n的序列需要m + n -1次比較。試設計乙個演算法確定合併這個序列的最優合併順序,使所需的總比較次數最少。
為了進行比較,還需要確定合併這個序列的最差合併順序,使所需的總比較次數最多。
對於給定的k個待合併序列,計算最多比較次數和最少比較次數合併方案。
輸入資料的第一行有1 個正整數k(k≤1000),表示有k個待合併序列。接下來的1 行中,有k個正整數,表示k個待合併序列的長度。
輸出兩個整數,中間用空格隔開,表示計算出的最多比較次數和最少比較次數。
input
output4
5 12 11 2
/***78 52
每次合併兩個序列時,令總比較次數增加 m+n-1
確定合併這個序列的最優合併順序,使所需的總比較次數最少:
要想使總比較次數最少,需要先合併短的序列,
使短序列合併最多次,使長序列合併最少次
確定合併這個序列的最差合併順序,使所需的總比較次數最多:
要想使總比較次數最多,需要先合併長的序列,
使長序列合併最多次,使短序列合併最少次
優先佇列知識
***/
#include #include ///優先佇列
using namespace std;
/***
每次合併兩個序列時,令總比較次數增加 m+n-1
確定合併這個序列的最優合併順序,使所需的總比較次數最少:
要想使總比較次數最少,需要先合併短的序列,
使短序列合併最多次,使長序列合併最少次
確定合併這個序列的最差合併順序,使所需的總比較次數最多:
要想使總比較次數最多,需要先合併長的序列,
使長序列合併最多次,使短序列合併最少次
優先佇列知識
***/
priority_queue , less> q1;///降序佇列
priority_queue , greater> q2;///公升序佇列
void get_maxsum();///計算最多比較次數
void get_minsum();///計算最少比較次數
int max_sum;
int min_sum;
int main()
max_sum = min_sum = 0;
get_maxsum();
get_minsum();
cout << max_sum << " " << min_sum << endl;
return 0;
}void get_maxsum()
}void get_minsum()
}
最優合併問題 (貪心演算法)
最優合併問題 time limit 1000 ms memory limit 65536 kib problem description 給定k 個排好序的序列s1 s2,sk 用2 路合併演算法將這k 個序列合併成乙個序列。假設所採用的2 路合併演算法合併2 個長度分別為m和n的序列需要m n 1...
最優合併問題 貪心演算法
給定k個排好序的序列s 1s 1 s1 s 2s 2 s2 s ks k sk 用2 路合併演算法將這k 個序列合併成乙個序列。假設所採用的2 路合併演算法合併2 個長度分別為m和n的序列需要m n 1次比較。試設計乙個演算法確定合併這個序列的最優合併順序,使所需的總比較次數最少。為了進行比較,還需...
貪心 最優合併問題
最優合併問題 time limit 1000ms memory limit 65536kb submit statistic discuss problem description 給定k 個排好序的序列s1 s2,sk 用2 路合併演算法將這k 個序列合併成乙個序列。假設所採用的2 路合併演算法合...