每日一題 46 合併果子

2021-10-05 16:38:24 字數 1064 閱讀 3921

思路在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。

每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過 n−1 次合併之後, 就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。

因為還要花大力氣把這些果子搬回家,所以多多在合併果子時要盡可能地節省體力。假定每個果子重量都為 1 ,並且已知果子的種類 數和每種果子的數目,你的任務是設計出合併的次序方案,使多多耗費的體力最少,並輸出這個最小的體力耗費值。

例如有 3 種果子,數目依次為 1,2,9 。可以先將 1 、 2 堆合併,新堆數目為 3 ,耗費體力為 3 。接著,將新堆與原先的第三堆合併,又得到新的堆,數目為 12 ,耗費體力為 12 。所以多多總共耗費體力=3+12=15 。可以證明 15 為最小的體力耗費值。

輸入格式

共兩行。

第一行是乙個整數 n(1≤n≤10000) ,表示果子的種類數。

第二行包含 n 個整數,用空格分隔,第 i 個整數 ≤20000) 是第 i 種果子的數目。

輸出格式

乙個整數,也就是最小的體力耗費值。輸入資料保證這個值小於 231。

利用c++stl容器的set,但是set種不能含有相同的數,所以利用multiset

判斷multiset中如果存在1個以上的數,則相加容器前兩個val(容器直接排好序)

把相加得到的值存回容器中繼續步驟2,直至容器剩下乙個數,列印。

解答**:

#include

#include

using

namespace std;

intmain()

while

(data.

size()

>1)

cout << sum;

return0;

}

**生成圖

每日一題 46

第四十六題 定義乙個3行3列的二維陣列,從鍵盤輸入9個數的值。輸出其中最大值和最小值及其所在的行列座標。include stdio.h void main 運算 max arr 0 0 min arr 0 0 for i 0 i 3 i for j 0 j 3 j if arr i j 輸出 pri...

每日一題 46插入區間

給出乙個無重疊的 按照區間起始端點排序的區間列表。在列表中插入乙個新的區間,你需要確保列表中的區間仍然有序且不重疊 如果有必要的話,可以合併區間 示例 1 輸入 intervals 1,3 6,9 newinterval 2 5 輸出 1 5 6,9 示例 2 輸入 intervals 1,2 3,...

每日一題 合併集合

一共有 n 個數,編號是 1 n,最開始每個數各自在乙個集合中。現在要進行 m 個操作,操作共有兩種 m a b,將編號為 a 和 b 的兩個數所在的集合合併,如果兩個數已經在同乙個集合中,則忽略這個操作 q a b,詢問編號為 a 和 b 的兩個數是否在同乙個集合中 輸入格式 第一行輸入整數 n ...