C 最優合併問題(貪心)

2021-09-18 07:07:46 字數 1322 閱讀 3408

time limit: 1000 ms memory limit: 65536 kib

submit

statistic

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

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

sample input

4

5 12 11 2

sample output

78 52
hint

source

/*

例: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 using namespace std;

bool cmp(int a, int b)

int main()

int max = 0, min = 0;

for (int i = 0; i < k - 1; i++)

min += mark1-1;

l.push_back(mark1);

p.sort(cmp);

int mark2 = 0;

for (int i = 0; i < 2; i++)

max += mark2-1;

p.push_back(mark2);

}cout << max << " " << min << endl;

system("pause");

}

貪心 最優合併問題

最優合併問題 time limit 1000ms memory limit 65536kb submit statistic discuss problem description 給定k 個排好序的序列s1 s2,sk 用2 路合併演算法將這k 個序列合併成乙個序列。假設所採用的2 路合併演算法合...

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

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