1. 程式人生 > >HDU 1677 (貪心 || 貪心加二分)

HDU 1677 (貪心 || 貪心加二分)

題意:

有T個案例,給n個俄羅斯套娃的寬高,隨後是n個w、h,如果當前的娃娃比其他的娃娃寬高就要小,那麼就可以把當前娃娃放到這個大娃娃中。

思路&做法:

我最初的思路是遍歷輸入的娃娃也就是a陣列,當前娃娃比其他娃娃都小,那麼就放到第二小中。當然我也是卡死在了那個找的過程中。

毫無疑問我的思路是正確的,關鍵就是方法。

做法很多,巧了我都不會。

二分(簡略的思路):

找適合的娃娃,然後放進當前的娃娃 —— >成為一個娃娃。以此類推,之前也說過,但是這個二分吧,它就又很麻煩……主要是要找一個剛剛好的,但是這個剛剛好給我的感覺就是一個十分籠統的概念。有機會寫二分的時候再寫一遍。

貪心:

可以說找了很多部落格,我覺得這個最靠譜,各種精妙。也和我最初的思路最為接近。

建立一個數組res,保證res中的是最小的娃娃,先遍歷a陣列,然後遍歷res陣列,找現在這個a中的娃娃可不可以裝進res中的小娃娃,如果可以,那麼更新這個最小的娃娃。然後跳出。如果這個a陣列中的娃娃,無法裝進任何小娃娃,那麼它就是一個小娃娃,接下來就要把它放到res陣列中,因為res陣列要移動下標,不如直接來個vector來的快捷,所以我就用了一個v,很顯然,vector的size就是最後的結果。

但是現在這樣就存在好幾個問題,是否要排序,怎樣排序,以及為什麼要跳出。

排序的原因是要找這個剛剛好的娃娃,那麼為什麼w要升序,而h要降序。所以排序是要的。

跳出是為了防止一個娃娃重複包括小娃娃,這樣小娃娃的陣列就會被重複更新,導致後來的a中的娃娃無法包括res中的娃娃,那麼結果就會是錯誤的。