POJ1704 Georgia and Bob 博弈论 尼姆博弈 阶梯博弈
http://poj.org/problem?id=1704
我并不知道阶梯博弈是什么玩意儿,但是这道题的所有题解博客都写了这个标签,所以我也写了,百度了一下,大概是一种和这道题类似的能转换为尼姆博弈的博弈。
解法大概是配对之后的尼姆博弈,没看到一个格子只能放一个石头(以为可以直接把石头移动到前一个石头在的格子),所以莫名其妙wa了orz,总是因为题目被踩爆orz
其实博弈也是个很神奇的东西,现在这个东西给我的印象又变成配对找规律了(泪),虽然看上去从后往前两两配对的做法很有道理但是迫切需要更数学的解释(这个东西似乎更数学的解释看不懂orz)
嗯做法就是从后往前两两配对(奇数个就把第一个和位置0配对),然后显然(完全不)当每对的前一个移动时,后一个也一定可以移动同样步数,后一个移动时对前一个并没有什么影响,所以把每一对的两个的位置差异或起来就好了(不要直接减…要明白,每一对里后一个能移动的步数最多为两个的位置差-1)。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 #include<iostream> 6 #include<map> 7 using namespace std; 8 const int maxn=1010; 9 int T,n; 10 int a[maxn]={}; 11 int main(){ 12 scanf("%d",&T); 13 while(T-->0){ 14 scanf("%d",&n); 15 int y=0; 16 for(int i=1;i<=n;i++){ 17 scanf("%d",&a[i]); 18 }sort(a+1,a+1+n); 19 if(n&1){ 20 for(int i=1;i<=n;i+=2){ 21 y^=a[i]-a[i-1]-1; 22 } 23 } 24 else{ 25 for(int i=2;i<=n;i+=2){ 26 y^=a[i]-a[i-1]-1; 27 } 28 } 29 if(y)printf("Georgia will win\n"); 30 else printf("Bob will win\n"); 31 } 32 return 0; 33 }