1. 題目描述
給定k 個排好序的序列s1 , s2,……, sk , 用2 路合併演算法將這k 個序列合併成乙個序列。假設所採用的2 路合併演算法合併2 個長度分別為m和n的序列需要m + n -1次比較。試設計乙個演算法確定合併這個序列的最優合併順序,使所需的總比較次數最少。2. 輸入描述為了進行比較,還需要確定合併這個序列的最差合併順序,使所需的總比較次數最多。
對於給定的k個待合併序列,計算最多比較次數和最少比較次數合併方案
輸入資料的第一行有1 個正整數k(k≤1000),表示有k個待合併序列。接下來的1 行中,有k個正整數,表示k個待合併序列的長度3.輸出描述
輸出兩個整數,中間用空格隔開,表示計算出的最多比較次數和最少比較次數4.輸入樣例
45.輸出樣例5 12 11 2
78 526.解法一(解題思路)
例:4 5 12 11 2(這些是序列的長度)排序2,4,5,11,12
貪心策略:每次選最小的序列合併得到最少比較次數;每次選最大的序列合併得到最多比較次數
2 個長度分別為m和n的序列需要m + n -1次比較
最多比較次數=(12+11-1)+ (12+11+5-1 )+ (12+11+5 +4 -1)+ (12+11+5+4+2-1 )
最少比較次數=(2+4-1)+(5+2+4-1)+(11+2+4+5-1)+(12+2+4+5+11-1)
#include
using
namespace std;
priority_queue<
int> q1;
// 大根堆 (內部是棧)5 4 3 2 1
priority_queue<
int, vector<
int>
, greater<
int>
>q2;
// 小根堆 (內部是棧)1 2 3 4 5
intf()
cout << max_sum <<
" "<< min_sum;
}int
main()
f();
return0;
}
6. 解法二#include
using
namespace std;
intgetmin
(int a,
int k)
return min_sum;
}int
getmax
(int b,
int k)
return max_sum;
}int
main()
最優合併問題
include iostream include fstream include vector include queue using namespace std int a 50 n為要合併的序列個數 返回最少合併次數 int mergemin int n q.pop return sum n為要...
最優合併問題
給定k個排好序的序列s1,s2,sk,用2路合併演算法將這k個序列合併成乙個序列。假設所採用的2路合併演算法合併兩個長度分別為m和n的序列需要m n 1次比較。試設計乙個演算法確定合併這個序列的最優合併順序,使所需要的總比較次數最少。測試用例 4 序列數 5 12 11 2 序列中的元素數 輸出 7...
最優合併問題
include define k 4 int data k void sort int data max 12 11 12 11 5 12 11 5 2 k 1 min 2 5 2 5 11 2 5 11 2 k 1 按照這兩個公式求解的 int main index max k 1 最好情況 雖然...