山东省17年省赛A:http://exam.upc.edu.cn/problem.php?id=3391
这题用了两种博弈一种是尼姆博弈针对 n==2时 而威佐夫博弈即n>=3时
一开始没看出来,这题不错,综合了两种博弈。
尼姆博弈是 if( 两堆差值× (sqrt(5)+1)/2 == 最小堆 ) 后手赢,否则 先手赢;
威佐夫博弈是 if(n堆异或后的值==0) 后手赢,否则 先手赢。
#include<bits/stdc++.h> using namespace std; int main() { int T; scanf("%d",&T); while(T--){ int n; scanf("%d",&n); if(n==2){ int a,b; scanf("%d%d",&a,&b); if(a>b)swap(a,b); int temp=(b-a)*(sqrt(5.0)+1)/(2.0); if(a==temp)printf("Watson\n"); else{ printf("Sherlock\n"); } }else{ int a[10004]; scanf("%d",&a[0]); int temp=a[0]; for(int i=1;i<n;i++){ scanf("%d",&a[i]); temp^=a[i]; } if(temp==0)printf("Watson\n"); else{ printf("Sherlock\n"); } } } return 0; }