洛谷P1090合併果子,貪心演算法 純C語言

2021-10-02 15:17:30 字數 1509 閱讀 7508

附上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 次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的...