time limit: 1000 ms memory limit: 65536 kib
submit
statistic
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
hint
請注意資料範圍是否可能爆 int。
source
樣例:7 5
5 9 12 13 16 22 45
那麼 最小值應該是148 ,但是如果按照我們的貪心演算法是先將最小的情況合併的話 那麼就會出錯
過程:
5 9 12 先合併為26
然後13 16 22 26 45 再合併就122
結果為122+26 = 148 over
問題來了,那麼要怎麼解決?
發現往前面+0即可 就是
樣例:9 5
0 0 5 9 1213 16 22 45
那麼就是0 0 5 9 12 = 26
然後13 16 22 26 45----->122 + 26 = 148
至於最大值就是最大的兩個數合併再扔進去即可~~~
#include #include#includeusing namespace std;
typedef long long ll;
int main()
printf("%lld %lld\n",ans2,ans1);
return 0;
}
多元Huffman編碼問題
problem description 在乙個操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次至少選2 堆最多選k堆石子合併成新的一堆,合併的費用為新的一堆的石子數。試設計乙個演算法,計算出將n堆石子合併成一堆的最大總費用和最小總費用。對於給定n堆石子,計算合併成一堆的最大總費用和最...
多元Huffman編碼問題
problem description 在乙個操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次至少選2 堆最多選k堆石子合併成新的一堆,合併的費用為新的一堆的石子數。試設計乙個演算法,計算出將n堆石子合併成一堆的最大總費用和最小總費用。對於給定n堆石子,計算合併成一堆的最大總費用和最...
多元Huffman編碼問題
time limit 1000 ms memory limit 65536 kib submit statistic problem description 在乙個操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次至少選2 堆最多選k堆石子合併成新的一堆,合併的費用為新的一堆的石子數。...