11079
可以移動的石子合併
時間限制
:1000ms
記憶體限制
:1000k
題型:
程式設計題語言
: 無限制
description
有n堆石子形成一行(a1,a2,…,an,ai為第i堆石子個數),現要將石子合併成一堆,規定每次可選擇至少2堆最多k堆移出然後合併,每次合併的分值為新堆的石子數。
若干次合併後,石子最後肯定被合併為一堆,得分為每次合併的分值之和。
現在求解將這n堆石子合併成一堆的最低得分和最高得分。
input
兩行。第一行n和k,第二行a1 a2 … an,每個ai(1<=i<=n)表示第i堆石子的個數,n<=100,2<=k<=n。
output
僅一行,為石子合併的最低得分和最高得分,中間空格相連。
sample input
7 3
45 13 12 16 9 5 22
sample output
199 593
hint
此題貪心演算法求解.
給這題標記標籤"dp"方法是同學所為,並非老師標註.動規不是不可以,但有更好更快的貪心解法的.
如7堆石頭,每次可選擇最少2堆最多3堆合併,可以如下這樣合併:
第1次合併:45+22=67
第2次合併:67+16=83
第3次合併:83+13=96
第4次合併:96+12=108
第5次合併:108+9=117
第6次合併:117+5=122
合併的總分值:67+83+96+108+117+122=593,593已是最大分值。
也可以這樣合併:
第1次合併:5+9+12=26
第2次合併:13+16+22=51
第3次合併:45+51+26=122
合併的總分值:26+51+122=199,199已是最小分值。
因此此題貪心的方法如下:
(1)保證每次選兩堆最多的,合併直至只剩一堆為止,能獲得最大得分;
這個和huffman樹構造是相同的,不再詳述!
(2)保證每次選k堆最少的,合併直至只剩一堆為止,能獲得最小得分。
這個是多元huffman樹的構造。要注意的是:在合併之前,若n%(k-1)!=1,說明合併到最後一輪時,剩下不是k堆(而是比k堆少),這樣算的並不是最小得分,
而必須在合併之前新增若干個為0的虛擬堆,目的為湊成的堆數保證每次都能有k堆合併(包括最後一次)最後合併為1堆。
因此,在合併前作如下處理:
//假設石頭每堆個數放於stone[1]~stone[n],且stone[n]之後最多k-1個陣列單元為可寫;
while (n % (k - 1)!= 1)
可以移動的石子合併
有n堆石子形成一行 a1,a2,an,ai為第i堆石子個數 現要將石子合併成一堆,規定每次可選擇至少2堆最多k堆移出然後合併,每次合併的分值為新堆的石子數。若干次合併後,石子最後肯定被合併為一堆,得分為每次合併的分值之和。現在求解將這n堆石子合併成一堆的最低得分和最高得分。1 保證每次選兩堆最多的,...
不能移動的石子合併
時間限制 1000ms 記憶體限制 1000k 提交次數 0 通過次數 0 題型 程式設計題 語言 g gcc vc 做如下兩個模型的石子合併,如下模型石子都不能移動出列,且合併都僅發生在相鄰兩堆石子中 1 第乙個模型 一行排列且相鄰合併 有n堆石子a1,a2,an形成一行,每堆石頭個數記為ai 1...
環形結構上的石子合併
題目 在乙個圓形操場的四周擺放 n 堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計出乙個演算法,計算出將 n堆石子合併成 1堆的最大得分。輸入格式 資料的第 1行是正整數 n,表示有 n 堆石子。第 2行有 n 個整數,...