貪心 最優合併問題

2021-08-10 02:50:43 字數 1300 閱讀 5228

最優合併問題

time limit: 1000ms memory limit: 65536kb

submit statistic discuss

problem description

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

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

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

input

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

output

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

example input

4 5 12 11 2

example output

78 52

例: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+6-1+11+11-1((((2+4-1)+5-1)+11-1)+12-1)

#include 

#include

using

namespace

std;

//標頭檔案#include

//sort(陣列名,陣列名+要排序的元素個數) 函式作用:遞增排序

//reverse(陣列名,陣列名+要排序的元素個數) 函式作用:逆置陣列

int main()

sort(a,a+k);

int min_sum=0;

int min_mark=0;

while(min_mark1)

sort(b,b+k);

int max_sum=0;

int max_mark=0;

for(int hh=1;hh<=k-1;hh++)

cout

<" ";

cout

0;}

C 最優合併問題(貪心)

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

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

最優合併問題 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次比較。試設計乙個演算法確定合併這個序列的最優合併順序,使所需的總比較次數最少。為了進行比較,還需...