HDU 1847 Good Luck in CET-4 Everybody!(巴什博弈)

題意:

1、  總共n張牌; 
2、  雙方輪流抓牌; 
3、  每人每次抓牌的個數只能是2的冪次(即:1,2,4,8,16…) 
4、  抓完牌,勝負結果也出來了:最後抓完牌的人爲勝者;


思路:很久以前做過這題,可以拿sg函數做,也可以用pn做,現在才知道也是個巴什博弈


摘自:點擊打開鏈接

巴什博弈(定理獻上):

              只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取一個,最多取m.最後取光者得勝.

       n = (m+1)r+s , (r爲任意自然數,sm), 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做法在這點擊打開鏈接
發佈了497 篇原創文章 · 獲贊 623 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章