切換
舊版
前往
大廳
主題

ZeroJudge - b051: 2. 排列最大值 解題心得

Not In My Back Yard | 2018-10-13 13:35:35 | 巴幣 0 | 人氣 391

題目連結:


題目大意:
給定一正整數N,代表接下來有N個正整數。

求那N個數字排列組合並接在一起,產生出來的新數字的最大值



範例輸入:
5 123 124 56 90 9
5 28 285 287 2851 2859
2 25 2523
3 89 898 899



範例輸出:
99056124123
2872859285285128
252523
89989898



解題思維:
變化的排序題。

我們可以藉由討論以下情形,從而知道排序的比較條件。以下稱第一個拿來比較的數字為N1,第二數字則為N2:

第一種情形,N1、N2的位數一樣。非常直觀,直接看誰大誰小就好。大的放前面(左邊),小的則是在後面;如果一樣,那放哪都沒差。

第二種情形,N1比N2的位數多。假設N1的長度為S1,
(2023 / 12 / 7 編輯:這部分錯的,但是只錯最後的部分)

N2的長度為S2。那麼先由最左邊的位數到第S2個位數,判斷在相同位數時,是否有誰比較大。有的話就跟第一種情形一樣,大的放前面,小的放後面;反之,則繼續比較。

如果比到前S2位都一樣大,
那就拿N1的「第S2+1位」與N2的「第1位」比較,有誰大誰小的話,則同上;
不然,拿N1的「第S2+2位」跟N2的「第2位」比較,同上。
以此類推,直到有誰大誰小或是N1的所有位數都比過了。

全部比較完,卻還沒有分出勝負的話:就把短的放前面,長的放後面即可。
編輯:並非如此。例如說 132 和 13 比較,應當是 132 在前面(可以看到 13213 > 13132)。原因是比較的過程不應停止於兩者的最小長度,應繼續進行。

也就是最短的字串再從頭開始,而較長的字串則繼續。如果過程中有字串又跑到了結果則再回到開頭。直到兩者又同時回到開頭,也就是比較次數是兩者長度的最小公倍數(Least Common Multiple)。如果比到這個時候都沒有分出勝負,則兩者誰先誰後都可以。

最後的第三種情形,N1的位數比N2少。而其實我們已經在第二種情形的時候就解決了,只是N1、N2大小顛倒而已。

這樣便可以確保接起來的數字,是盡可能地大了。

而比較的方法有了,剩下的就是排序的方法本身。而手段很多,可以用內建的sort、也可以自己寫其他的排序法。這裡就交給讀者們各自去找到出路。


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

創作回應

alan232738
嗨嗨 我這裡有更簡潔的方法 供您參考!

https://alan23273850.github.io/Online-Judge-Problems/zerojudge/b0512.-%E6%8E%92%E5%88%97%E6%9C%80%E5%A4%A7%E5%80%BC/
2021-03-31 23:46:31
Not In My Back Yard
感謝補充。
2021-03-31 23:56:02

更多創作