11079 可以移動的石子合併

2021-06-12 11:53:58 字數 1493 閱讀 1436

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 個整數,...