【题目描述】
A 和 B 在玩游戏。桌子上有 n 个格子,其中一些格子放有棋子‘x’,空格子用‘o’表示。A 和 B 轮流进行以下操作中的任何一种。
(1) 当某一个棋子右边有空格时,将该棋子向右移动一位。
ooxoo -> oooxo
(2) 当某一个棋子右边恰好是连续的两个棋子时,将该棋子直接跳过连续的两个棋子。
ooxxxoo -> oooxxxo
当棋子到达终点(最右端的格子)时,棋子将消失。当某一方不能移动时,这方输。A 先走。请问 A 是否必胜?
【输入格式】
多组测试数据。
对于每一组测试数据:第一行输入一个整数 n,表示格子数量。第二行输入长度为 n 的‘x’‘o’串。【输出格式】
对于每一组测试数据,输出一行“YES”或者“NO”。
【样例输入】
4
ooxo
4
xxxo
5
oxxxo
【样例输出】
YES
NO
NO
【数据范围】
对于 30%的数据,n≤20
对于 100%的数据 ,n≤10^6,测试数据组数 T≤5,最后一个格子为空。
【来源】
By tsy
题解:
首先确定一点:无论走操作(1)还是操作(2),走的步数一定是奇数。
操作(1)是一个棋子走一步;操作(2)可以看作三个棋子一起走一步,一共走了三步。
然后看题。题目可以简化成三个条件:①A走第一步;②A、B轮流走;③A要赢得走最后一步。
于是就可以得出A的胜利条件:所有棋子走到最右的总步数之和必须是奇数。
#include<cstdio> const int Mod=1e4; const int N=1e6+10; int n, sum; char s[N]; int main() { while( ~scanf( "%d%s", &n, s+1 ) ) { sum=0; for( int i=n-1; i; i-- ) if( s[i]=='x' ) sum=( sum+(n-i)%Mod )%Mod; if( sum&1 ) printf( "YES\n" ); else printf( "NO\n" ); } return 0; }
P.S.这是我做过的最简单的模拟题,没有之一。
[NOIP模拟赛]游戏
最新推荐文章于 2023-11-12 21:58:47 发布