1. 程式人生 > >博弈論------白書

博弈論------白書

poj2484

兩枚硬幣排成一個圈,alice和bob輪流從中取一枚或者兩枚硬幣。不過,取兩枚時,所取的硬幣必須是連續的。硬幣取走後留下空位,相隔空位的硬幣被視為是不連續的。alice開始先取,取走最後一枚硬幣的一方獲勝。當雙方都採取最優策略,誰會獲勝。

輸入(硬幣的個數)(0<=n<=1000000)

輸出 贏的人的姓名

首先n的範圍過大,不適合採用sg函式打表的方式,如果打表的話,會超時或者超空間,而且最重要的一點是圓排列的變化會有很多

然後圓上有一個對稱的特點,可以圍繞這個對稱的特點展開文章,當對手取走一部分時,你可以取走對稱部分的相對應的圓排列,這樣可以保證後手必贏,而且有一點可以保證的就是到為奇數的時候,當第一次對手取2個,你可以通過取1個變成對稱的情況,而對手取1個,你可以取兩個

 1 #include<cstring>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstdio>
 5 using namespace std;
 6 int n;
 7 int main(){
 8     while(scanf("%d",&n)!=EOF){
 9         if(n==0) break;
10         if(n==1||n==2) printf("Alice\n");
11         else printf("Bob\n
"); 12 } 13 return 0; 14 }