最優合併問題 貪心演算法

2021-10-10 20:52:22 字數 1235 閱讀 8999

給定k個排好序的序列s

1s_1

s1​, s

2s_2

s2​,……,s

ks_k

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

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

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

input

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

output

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

sample input

4512

112

sample output

78

52

(1)該題與多元huffman編碼問題類似,可以用優先佇列解答。

(2)2 路合併演算法就是每次合併兩個序列。可以證明:對遞增序列可以求得最少比較次數,對遞減序列可以求得最多比較次數。

(3)與多元huffman編碼問題稍微不同的地方:根據題意,每次合併完後,要將得到的sum值先減去1後,再加入到sum

1sum_1

sum1​或sum

2sum_2

sum2

​中去。

#include

using

namespace std;

intmain()

while

(q1.

size()

>1)

sum1+

=sum-1;

//每合併兩個序列,需要比較 m+n-1 次

q1.push

(sum);}

while

(q2.

size()

>1)

sum2+

=sum-1;

q2.push

(sum);}

cout<" "

}

最優合併問題 (貪心演算法)

最優合併問題 time limit 1000 ms memory limit 65536 kib problem description 給定k 個排好序的序列s1 s2,sk 用2 路合併演算法將這k 個序列合併成乙個序列。假設所採用的2 路合併演算法合併2 個長度分別為m和n的序列需要m n 1...

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

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

貪心演算法 最優裝載問題

1 資料結構定義 double w n 一維陣列儲存古董的重量 2 按重量排序 sort w,w n 按古董重量公升序排序 3 按照貪心策略找最優解 首先用變數 ans 記錄已經裝載的古董個數,tmp 代表裝載到船上的古董的重量,兩個變 量都初始化為 0。然後按照重量從小到大排序,依次檢查每個古董,...