博弈論------白書
阿新 • • 發佈:2018-11-03
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 }