G59 台阶型 Nim游戏
视频链接:https://www.bilibili.com/video/BV18M411M7TC/
题意:
给你一个单行网格的棋盘,给定 𝑛 个棋子在网格中的初始位置 𝑎𝑖。
每次玩家选择一个棋子,并将其向左移动,但是不能越过任何其他棋子或超过左边界。玩家可以自由选择棋子移动的步数,其限制是棋子必须至少移动一步,一个网格最多可以包含一个棋子。
无法移动任何棋子的玩家将输掉游戏。每次都由格鲁吉亚先手。请你预测谁将获得胜利。
 
 
思路:
转化为台阶型 Nim游戏:将空白格子看做台阶上的石子,棋子左移等价于空白格子右移,即石子向右移下台阶。所以,将 n-1,n 棋子间空白格子数记为 b1,将 n-2,n-1 棋子间空白格子数记为 b2,…,将 1 棋子前面的空白格子数记为 bn。
b1∼n分别代表第 1∼n 阶梯上摆放的石子数,b1^b3^b5…≠0 时,先手必胜。
时间:T*nlogn
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int T,n; int a[1005],b[1005]; int main(){ cin>>T; while(T--){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1); for(int i=n;i>=1;i--)b[n-i+1]=a[i]-a[i-1]-1; int s=0; for(int i=1;i<=n;i+=2) s^=b[i]; if(s) puts("Georgia will win"); else puts("Bob will win"); } }
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号