切換
舊版
前往
大廳
主題

ZeroJudge - d655: 許胖公仔 解題心得

Not In My Back Yard | 2018-12-09 14:53:31 | 巴幣 2 | 人氣 194

題目連結:


題目大意:
第一列給定一正整數 T ( 1 ≦ T ≦ 1, 000, 001 ),代表接下來有T列的輸入。

每一列的輸入包含一正整數 N ( 0 ≦ N ≦ 2, 000, 000, 000 ),代表要帶 N 塊錢。

而現在有 1、5、10、30、50、70、100、110、500、1000 塊面額的硬幣,求要湊到 N 塊錢所需的最少硬幣數量為何?



範例輸入:
3
30
140
250



範例輸出:
1
2
3



解題思維:
乍看之下像是一題非常一般的DP題。但是由於N實在太大,建表不實際,而輸入時才求解也是不大明智的選擇。

因此我們可以想辦法降低需要求解的範圍。經過一番思考,我們可以發現當 N ≧ 1000 ,最佳的方法數必定為:
Floor(N / 1000)+( N mod 1000 )之方法數。
其中,Floor()代表將結果取下高斯(對正數來說,無條件捨去;負數則為無條件進位)。因為如果不用 1000 塊的話,想要快速逼近 N 塊錢就必須要至少兩個 500 塊,但是兩個 500 塊可以替換成一個 1000 塊,因而造成上式的結果。

相似地,我們也可以求出當 500 ≦ N < 1000 時,方法數為:
Floor(N / 500)+( N mod 500 )之方法數。
其中的理由跟上面相同。



經過以上篩選後,真正需要算的範圍也只剩下 N < 500 以下了,此時就可以套用之前的文章提到過的方法去DP。最後只要每輸入一次 N 就進行以上的關係式,再加上取完餘數(值必定介於 0 ~ 499 之間)相應的方法數即可。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

場外第一邊緣人
下高斯 和 無條件捨去 有點不太一樣吧 如果是負數取下高斯的話
2018-12-14 11:54:12
Not In My Back Yard
啊啊,不好意思 因為題目的數字都為正,就忽略了XD
感謝指正。
2018-12-14 12:10:49

更多創作