題意:
1、 總共n張牌;
2、 雙方輪流抓牌;
3、 每人每次抓牌的個數只能是2的冪次(即:1,2,4,8,16…)
4、 抓完牌,勝負結果也出來了:最後抓完牌的人爲勝者;
思路:很久以前做過這題,可以拿sg函數做,也可以用pn做,現在才知道也是個巴什博弈
摘自:點擊打開鏈接
巴什博弈(定理獻上):
只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取一個,最多取m個.最後取光者得勝.
n = (m+1)r+s , (r爲任意自然數,s≤m), 即n%(m+1) != 0, 則先取者肯定獲勝。
巴什博弈還是很好理解滴,以你是先手的角度考慮。你想把對手給弄垮,那麼每一局,你都必須構建一個局勢,這個局勢就是每次都留給對手m+1的倍數個物品(爲什麼留給m+1倍就一定能贏,你稍微動動腦子就出來了)。所以不只是取物品中的博弈可以用到巴什定理,還可以是報數之類的,看誰先報到100.並且每次報的數必須是1~10(包括1跟10),那麼你每次都應該留給對手剩下的報數個數爲11的倍數。
如果你是先手,那麼請考慮你的必勝點。由於規定只能去2的冪次,那麼只要你留給對手的牌數爲3的倍數時,那麼你就必贏,因爲留下3的倍數時,對手有兩種情況:1,要麼取剩下1,給你勝利 2,要麼對手取了一點點兒,輪到你時,你就又可以構造一個3的倍數了嘛。 所以無論哪種情況,當你留給對手爲3N的時候,你是必勝的。好吧,題目說你就是Kiki,那麼當牌數爲3的倍數時,Kiki就輸了。因爲一出來,上帝就留給了Kiki一個3的倍數。沒辦法,但是如果一開始上帝留給Kiki的不是3的倍數,那麼Kiki肯定能夠用先手的優勢構造出3的倍數,那麼Kiki就必勝。所以代碼是異常的簡單啊。
代碼:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n;
while (sc.hasNext()) {
n = sc.nextInt();
System.out.println(n%3==0 ? "Cici" : "Kiki");
}
}
}
sg和pn做法在這點擊打開鏈接