【2021noip模拟赛day3】A. 棋盘战争
【题意】
给定n个环,每个有$a_i$个点,rabbit先手,hamster后手,每次可以选择一个没有被占领的点放上自己的棋子,要求自己的两个棋子不能相邻,问谁必胜
【分析】
首先,我们先考虑一个环的时候的问题,显然有1个点的时候先手必胜,2个点、3个点的时候先手必败
如果有多于3个点的情况,我们考虑先手先放在一个位置,会导致它和它相邻的两个位置都无法被先手继续放了,那么后手就可以通过把自己的棋子放在这两个相邻的位置之一或者新的一个位置(指除去这三个位置以外的其他位置),那么棋盘就减小了3、4,显然后手可以得到必胜的策略
那么我们发现一个环时,只有出现1才是先手必胜
而这个nim游戏多个游戏的和就是他们的异或,也就是有奇数个1先手必胜,偶数个1后手必胜
如果有问题希望能指正
官方题解:
【代码】
#include<bits/stdc++.h> using namespace std; typedef long long ll; int t; int n,x; int main() { freopen("chess.in","r",stdin); freopen("chess.out","w",stdout); scanf("%d",&t); while(t--) { int flag=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&x); if(x==1) flag^=1; } if(flag) printf("rabbit\n"); else printf("hamster\n"); } return 0; }