附上c語言**
#include
int total =0;
//搬運果子需要的總力氣,設為全域性變數
void
mergesort
(int a,
int s,
int e,
int temp)
;//歸併排序基本操作
void
merge
(int a,
int s,
int m,
int e,
int temp)
;// 歸併排序基本操作
intmain()
mergesort
(fwight,
0,n -
1,temp)
;//將重量從小到大排序
while
(n >1)
}}printf
("%d"
,total)
;//輸出結果
return0;
}//下面都是歸併排序,就不多說了,以後可以寫乙個專門說歸併排序的,這裡偷個懶,但是還要提一句的是,
//歸併排序的時間複雜度和快排是一樣的,但是空間複雜度較高,這道題有時間複雜度的限制,所以用常規排序會超時
//c++選手也可以用sort函式,c語言沒有,我就自己寫了,sort函式的時間複雜度和快排一樣
void
mergesort
(int a,
int s,
int e,
int temp)
}void
merge
(int a,
int s,
int m,
int e,
int temp)
while
(p1 <= m)
temp[pb++
]= a[p1++];
while
(p2 <= e)
temp[pb++
]= a[p2++];
for(
int i =
0;i < e - s +
1;i++
) a[s + i]
= temp[i]
;}
刪除線格式
這道貪心題要求花費的力氣最小,想要列舉的同學肯定會超時的,但是我們會發現,只要每回合併的果堆是所有果堆中重量最小的兩堆,每次就能花費最小的力氣,根據貪心邏輯,最終花費的力氣也一定最小。有乙個地方去要注意,在對更新過的陣列進行再排序時不能繼續用時間複雜度為nlog(n)的演算法(快排,歸併排序),因為會超時(我第一次就超時了),所以我們改用線性的交換方法,時間複雜度為n,**將合併後的元素(第乙個元素)與後面的元素逐一比較,如果後面的元素比較小就交換兩個元素,**所以合併後的元素就能被換到合適的位置,一旦它被換到合適的位置 ,因為其他元素本來就是有序的,下一次排序也就結束了,然後重複上面的操作就可以ac了。
溜了溜了~~
洛谷 P1090 合併果子
題目描述 在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n 1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗...
洛谷 P1090 合併果子
在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過 n 1n 1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體...
洛谷 P1090 合併果子
題目鏈結 題目描述 在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過 n 1n 1 次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的...