题目链接在这里:C-Palindrome Game (hard version)_牛客竞赛博弈专题班组合游戏基本概念、对抗搜索、Bash游戏、Nim游戏习题 (nowcoder.com)
这题挺人类智慧的,但是也有博弈论的一般思想,就是二者在中间过程的时候一直做着对称的工作或者执行相同的策略,只在开头或者结尾的时候先手会根据形势作出不同的决策,以后在做博弈论问题的决策时要考虑到这一点。
对于这道题来说,我们可以先看回文的情况,如果字符串长度为偶数那一定是后手胜,因为后手可以一直保证下完以后是一个回文串,然后在串只剩下一个0的时候选择操作二。如果是奇数且最中间是0的话,那么先手把这个0下了剩下的就是前一种情况。
如果是非回文的情况,基本都是先手胜,因为先手可以一直选择操作2,直到快要成回文串的时候选择自己是先手还是后手进入回文串。唯一一种平局的情况就是字符串为奇数只有2个0且最中间的是0.这个点很重要。
1 #include "bits/stdc++.h" 2 using namespace std; 3 const int MAX=1005; 4 int t,n; 5 char s[MAX]; 6 int cnt1,cnt2; 7 int main(){ 8 int i,j; 9 scanf("%d",&t); 10 while (t--){ 11 scanf("%d\n%s",&n,s+1); 12 cnt1=cnt2=0; 13 for (i=1;i<=(n-1)/2+1;i++){ 14 if (s[i]!=s[n-i+1]) 15 cnt1++; 16 } 17 for (i=1;i<=n;i++) if (s[i]=='0') cnt2++; 18 if (cnt1==0){ 19 if (cnt2==1){ 20 cout<<"BOB"<<endl; 21 continue; 22 } 23 if (cnt2%2==1){ 24 cout<<"ALICE"<<endl; 25 continue; 26 } 27 cout<<"BOB"<<endl; 28 } 29 else{ 30 if (cnt2==2 && n%2==1 && s[n/2+1]=='0') 31 cout<<"DRAW"<<endl; 32 else 33 cout<<"ALICE"<<endl; 34 } 35 } 36 return 0; 37 }
未来是什么样,未来会发生什么,谁也不知道。
但是我知道,
起码从今天开始努力,
肯定比从明天开始努力,
要快一天实现梦想。
千里之行,始于足下! ——《那年那兔那些事儿》