多元Huffman編碼問題 貪心加優先佇列

2021-09-29 11:38:06 字數 1070 閱讀 7857

problem description

在乙個操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次至少選2 堆最多選k堆石子合併成新的一堆,合併的費用為新的一堆的石子數。試設計乙個演算法,計算出將n堆石子合併成一堆的最大總費用和最小總費用。

對於給定n堆石子,計算合併成一堆的最大總費用和最小總費用。

input

輸入資料的第1 行有2 個正整數n和k(n≤100000,k≤10000),表示有n堆石子,每次至少選2 堆最多選k堆石子合併。第2 行有n個數(每個數均不超過 100),分別表示每堆石子的個數。

output

將計算出的最大總費用和最小總費用輸出,兩個整數之間用空格分開。

sample input

7 3

45 13 12 16 9 5 22

sample output

593 199
最大的花費,就要找最大的數重疊次數最多,所以與k無關,只需要從最大的開始每次都選最大的兩堆來相加就可以得出最大的重疊次數。

最小的花費思路和最大的相同,要重迭次數最小,就要挑選k最大,每次從最小的k堆,開始合併。這裡要做一步處理是如果最後不夠k堆合併的時候要在整個佇列的前面填0(填零的意思就是一開始不按照k堆合併,而是按照從0-k的乙個數合併,這樣後面的數重疊次數才是最小的,如果不補零,後面大的數就會多重疊)。

#include #include #include using namespace std;

int main()

long long minn = 0, maxx = 0;

long long sum1 = 0, sum2 = 0;

while(q2.size() % (k - 1) != 1)

while(q2.size() > 1)

minn += sum2;

q2.push(sum2);

}while(q1.size() > 1)

maxx += sum1;

q1.push(sum1);

}cout

}

貪心 多元Huffman編碼問題

多元huffman編碼問題 time limit 1000 ms memory limit 65536 kib problem description 在乙個操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次至少選2 堆最多選k堆石子合併成新的一堆,合併的費用為新的一堆的石子數。試設計...

1760多元Huffman編碼問題(貪心)

在乙個操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次至少選2 堆最多選k堆石子合併成新的一堆,合併的費用為新的一堆的石子數。試設計乙個演算法,計算出將n堆石子合併成一堆的最大總費用和最小總費用。對於給定n堆石子,計算合併成一堆的最大總費用和最小總費用。輸入資料的第1 行有2 個正整...

多元Huffman編碼問題 貪心演算法

在乙個操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次至少選2 堆最多選k堆石子合併成新的一堆,合併的費用為新的一堆的石子數。試設計乙個演算法,計算出將n堆石子合併成一堆的最大總費用和最小總費用。對於給定n堆石子,計算合併成一堆的最大總費用和最小總費用。input 輸入資料的第1 行...