給定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。然後按照重量從小到大排序,依次檢查每個古董,...