切換
舊版
前往
大廳
主題

ZeroJudge - d999: 清空倉庫遊戲 解題心得

Not In My Back Yard | 2019-01-20 20:47:04 | 巴幣 2 | 人氣 310

題目連結:


題目大意:
第一列給定一正整數 N (N ≦ 20),代表接下來的第二列有 N 個數字。第二列的數字 A 、 A 、…… 、 A,代表 OpenChan 、 Kitty 每一次可以拿取 A 、 A 、…… 、 A 個貨品(其中必定包含「1」這個正整數)。

第三列給定一正整數 K ,代表接下來有 K 列輸入。每列有一正整數 P (P ≦ 1, 000, 000),代表現在有 P 個貨品。而從 OpenChan 先拿,最後剛好拿完貨品的人獲勝。

假設兩個人都採取最佳的策略(即:若有必贏策略,則會如此行使),則對於每個 P 值求是 Kitty 還是 OpenChan 獲勝。



範例輸入:
3
1 3 5
3
10
11
12



範例輸出:
Kitty
OpenChan
Kitty



解題思維:
很明顯的這是一種數學遊戲叫做——拈(Nim,原版遊戲是拿石頭或是硬幣,此題即是拿石頭)。先手者常常有必贏的策略。

以範例輸入為例:我們有 A = 1 、 A = 3 、 A = 5 ,因此一次可以拿 1 、 3 、 5 個貨品。而因為 OpenChan 是先手,因此我們知道若 P = 1 、 3 或是 5 ,則 OpenChan 必勝。

而如果 P = 2 ,則因為一次拿的數量限制,導致 OpenChan 只能拿 1 個貨品。而也就造成了 Kitty 的贏面。 P = 4 、 P = 6 皆同理。

P = 7 時,情況又不一樣了。 OpenChan 不管怎麼拿,剩下的物品是 6 、 4 或是 2 個。而這幾個局面都是後手必勝(因為 OpenChan 剛拿完,所以現在後手變成了 OpenChan)。 Kitty 不管怎麼拿都會落得跟上面的 OpenChan 一樣必輸。

其他的 P 值以此類推。

而其他的 A 、 A 、 …… 、 A 值也是類似上面的情況,已知 OpenChan 在 P = A 、 A 、 …… 、 A 的時候必贏,因此可以推得其他 P 值。

最後對所有可能 P 值作預處理(計算勝負關係),當輸入任何 P 值,便可直接輸出。這樣就不會每輸入一次就要重新計算一次。

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

創作回應

更多創作