最優合併問題 SDUT OJ 貪心演算法

2021-10-10 23:07:40 字數 1501 閱讀 4025

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

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

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

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

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

input 

4

5 12 11 2

output 

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 路合併演算法合...