p 7 13最優合併問題

2021-10-01 12:06:01 字數 1490 閱讀 9976

1. 題目描述

給定k 個排好序的序列s1 , s2,……, sk , 用2 路合併演算法將這k 個序列合併成乙個序列。假設所採用的2 路合併演算法合併2 個長度分別為m和n的序列需要m + n -1次比較。試設計乙個演算法確定合併這個序列的最優合併順序,使所需的總比較次數最少。

為了進行比較,還需要確定合併這個序列的最差合併順序,使所需的總比較次數最多。

對於給定的k個待合併序列,計算最多比較次數和最少比較次數合併方案

2. 輸入描述
輸入資料的第一行有1 個正整數k(k≤1000),表示有k個待合併序列。接下來的1 行中,有k個正整數,表示k個待合併序列的長度

3.輸出描述
輸出兩個整數,中間用空格隔開,表示計算出的最多比較次數和最少比較次數

4.輸入樣例
4

5 12 11 2

5.輸出樣例
78 52

6.解法一(解題思路)
例: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 最好情況 雖然...