時間限制:
3000 ms | 記憶體限制:
65535 kb
難度:3 描述
小明很想吃果子,正好果園果子熟了。在果園裡,小明已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。小明決定把所有的果子合成一堆。 因為小明比較懶,為了省力氣,小明開始想點子了:
每一次合併,小明可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n-1次合併之後,就只剩下一堆了。小明在合併果子時總共消耗的體力等於每次合併所耗體力之和。
因為還要花大力氣把這些果子搬回家,所以小明在合併果子時要盡可能地節省體力。假定每個果子重量都為1,並且已知果子的種類數和每種果子的數目,你的任務是設計出合併的次序方案,使小明耗費的體力最少,並輸出這個最小的體力耗費值。
例如有3種果子,數目依次為1,2,9。可以先將1、2堆合併,新堆數目為3,耗費體力為3。接著,將新堆與原先的第三堆合併,又得到新的堆,數目為12,耗費體力為12。所以小明總共耗費體力=3+12=15。可以證明15為最小的體力耗費值。
輸入第一行輸入整數n(0輸出
每組測試資料輸出包括一行,這一行只包含乙個整數,也就是最小的體力耗費值。
樣例輸入
13 1 2 9
樣例輸出
15
解題思路
對於這個題可以實驗一組資料,分不同的搬運情況,觀察哪種最省力。
例: 1 2 4 5
(1,2)(4,5)(3,9) 24 接連兩個配對
(1,2)(3,4)(5,7) 22 每次最小的兩個配對
(1,5)(2,4)(6,6) 24 最大的和最小的配對
可以發現每次最小的兩個配對最省力。接下來就是考慮怎麼用演算法解決如何每次都讓最小的兩個相加配對了。最開始的想法是每次都快排,然後讓最小的兩個相加配對,結果正確,但是超時了。
後來發現,可以按從大到小配對,然後倒著配對相加,相加之後再倒著判斷並改變位置,相當於把兩個配對之後的和插進已經排好序的陣列之中,每次迴圈記得改變n的值。
看網上大神的**都用到了優先佇列,用到了資料結構,好吧,我還需要學習。通過跟大神**執行結果對比,資料結構縮短了時間,加大了空間,使執行速度加快了。
c**
#include#includeusing namespace std;
bool cmp(int a,int b)
int a[13000];
int main()
//這裡相當於把配對和插進已經排好序的陣列之中。
a[i+1]=now;
n--;//每次迴圈記得n--
} printf("%lld\n",sum);
} return 0;
}
ny55 懶省事的小明
時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述小明很想吃果子,正好果園果子熟了。在果園裡,小明已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。小明決定把所有的果子合成一堆。因為小明比較懶,為了省力氣,小明開始想點子了 每一次合併,小明可以把兩堆果子合併到一起,消...
懶省事的小明
時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 小明很想吃果子,正好果園果子熟了。在果園裡,小明已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。小明決定把所有的果子合成一堆。因為小明比較懶,為了省力氣,小明開始想點子了 每一次合併,小明可以把兩堆果子合併到一起,...
懶省事的小明
難度 3 描述 小明很想吃果子,正好果園果子熟了。在果園裡,小明已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。小明決定把所有的果子合成一堆。因為小明比較懶,為了省力氣,小明開始想點子了 每一次合併,小明可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經...