[USACO][TEXT] Section 1.2 Complete Search

雖然說沒貼圖會太空白,但是貼了圖會覺得有點不妥……

窮舉法

使用窮舉法 (complete search) 來解決問題是基於「保持著簡單且笨拙 (keep it simple, stupid)」的原則,其目的在於在時間之內解決問題,而不管有沒有比較有效率的演算法。

窮舉法利用了暴搜法 (brute force、straight-forward) 列舉所有可能來找出答案,這種方法可能是你第一個想到的演算法,如果這個方法可以在時間以及空間的限制下求解,那就去做吧!因為這是比較容易寫出而且容易除錯的方法,這就代表你可以有較多時間去處理那些暴搜法不能過的問題。

如果一個問題它的可能答案小於兩百萬,則可以列舉出所有答案看有沒有符合的。
但是小心,請小心
有時候題目不會那麼明顯要求你去使用這種方法。

問題:Party Lamps (IOI 98年)

你有 N 個檯燈和 4 個開關,第一個開關可以切換所有的檯燈狀態 (亦即開變關、關變開),第二個開關可以切換偶數號的檯燈,第三個開關切換奇數號的檯燈,而最後一個可以切換 1、4、7、10 …… 號的檯燈。

給你檯燈的數量 N、按開關的次數 (大於10000) 和每個檯燈的初始狀態 (例:7號檯燈是關著的),請輸出所有檯燈最後的可能狀態。

明顯地,如果把每個按鈕都按一次,你必須去試 4 種可能,而總共要試 $4^{10000}$ (大約 $10^{6020}$) 種可能,這意味著使用窮舉法是行不通的 (這種特殊的演算法必須配合遞迴)。無論讓它的可能答案降為 $10000^4$ (大約 $10^{16}$),這對窮舉法來說依然是個龐大的數字。

然而,對於每個按鈕按兩次,就相當於沒按一樣,所以你只要確認是否那個開關有沒有按就可以了,那麼所有可能只剩 $2^4 = 16$ 種可能,這種數量就可以在時間內解決問題。

問題 3:The Clocks (IOI 94年)

有九個鐘被放在 $3\times{3}$ 的格子內,每個鐘的時間被設定成 12 點、3 點、6 點或 9 點。你的目標就是操作他們讓他們都轉回 12 點,但是不幸地你只有一種方法可以控制它們--就是從九種已經被設定好的控制方法去選擇其中一種來執行,每種方法會指定某些鐘轉 90 度。

為了要找到最少的步驟將他們都轉回 12 點鐘,最明顯的方法就是使用遞迴來確認多少步驟,但是這種方法所需時間是 $9^k$,而 k 則是移動步數,然而 k 有可能非常大,所以這在合理的時間內並不能完成。

請注意有些步驟是多餘的,因此所需時間可以降為 $k^9$,但這還不能算足夠完善。然而,如果每個步驟做 4 次就相當於沒有做一樣,因此這裡只剩 49 種可能 (262,072種),我們可以在時間內求出答案。

範例問題

Milking Cows (USACO 1996 Competition Round)

給你一個擠牛奶的行程表 (農夫 A 在單位時間 300 到 1000 之間擠牛奶,農夫 B 在 700 到 1200 之間擠,…… 等等),請計算出:
至少一隻牛被擠奶的最長時間
沒有牛被擠奶的最長時間

Perfect Cows & Perfect Cow Cousins (USACO 1995 Final Round)

一個完全數 (perfect number) 就是所有真因數 (除了本身以外的正因數) 和為本身的數,舉例來說,28 = 1 + 2 + 4 + 7 + 14;而一對完全數對 (perfect pair,相當於友好數) 就是兩數的真因數和為對方 (例如 220 的真因數和為 284,284 真因數和為 220);因此,一個完全數群 (perfect sets) 就是第一個數的真因數和為第二個數、第二個數真因數和為第三個數、 …… 、最後一個數真因數和為第一個數。

現在John把他農場內的牛編上 1 至 32000 的數字,一個完全牛 (perfect cow) 就是牛上的數是完全數,而完全牛群就是牛上的數為一個完全數群。請找出所有的完全數牛以及完全數牛群。

,