ACM 演算法題目解

2021-04-30 13:55:35 字數 952 閱讀 8349

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

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

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

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

輸入格式

輸入包括兩行,第一行是乙個整數n(1<=n<=10000),表示果子的種類數。第二行包含n個整數,用空格分隔,第i個整數ai(1<=ai<=20000)是第i種果子的數目。

輸出格式

輸出包括一行,這一行只包含乙個整數,也就是最小的體力耗費值。輸入資料保證這個值小於2^31。

樣例輸入

樣例輸出

貪心演算法(利用堆解決)

#include

using namespace std;

int heap[10010];//堆所儲存的結點元素個數

int n;//數的個數

void heapf(int k)//建立堆的結構調整 k代表要從k的位置開始調整堆的結構

}int getmins()//獲得最小值

void inserts(int v)//插入元素 v代表要插入的數

void buildheaps()//建立乙個堆

int main()

printf("%d",sum);

return 0;

}

ACM題目分類

貪心 1.hdoj 1009 fatmouse trade 2.hdoj 2037 今年暑假不ac 3.hdoj 1050 moving tables 4.poj 1065 wooden sticks 5.hdoj 1203 i need an offer 6.poj 2287 tian ji th...

期望 acm題目

百事世界盃之旅 描述 在2003年6月之前購買的百事任何飲料的瓶蓋上都會有乙個百事球星的名字。只要湊齊所有百事球星的名字,就可以參加百事世界盃之旅的 活動,獲取球星揹包 隨身聽,更可以赴日韓 世界盃。還不趕快行動!你關上電視,心想 假設有n個不同球星的名字,每個名字出現的概率相同,平均需要買幾瓶飲料...

ACM題目小經驗

1.有時遇到定義成區域性變數就ac,定義到全域性就wa的情況,多半是因為這個變數每次都需要初始化,而全域性的時候只被初始化一次。在決定使用區域性變數還是全域性變數的時候應該先思考其初始化 是否需要針對每個case都初始化 的情況。2.字串char a abcd 是正確的,但如果a 0 a 0 則會出...