📚Description:
牌王和图王在玩一个游戏。
他们需要轮流移动字符串上的L,R指针,最后一位无法移动的人会输掉游戏。
给定一个字符串 s ,起初有两个指针 L 和 R 都指向字符串的下标为k的位置(1 <= k <= | s |,|s|表示字符串的长度)。牌王和图王轮流移动指针,重复若干个回合,在这几个回合之中,他们的行动需要满足如下条件:
-
牌王先手;
-
每次只能将 L 指针向左挪动,或者将 R 指针向右挪动,必须保证挪动后[L,R]之间的字符串比前一个操作中[L,R]之间的字符串的字典序更小;
-
每个人只能在上个人操作之后的指针的基础上操作(若牌王将指针移到 L= 1,R= 2 的位置,那么图王只能从 L= 1,R= 2 的位置开始操作,反之也是);
-
最后一个无法移动的玩家会输掉比赛。
牌王认为这个游戏很没有意思,因为他认为只要给他一个串和起始的位置 k ,就能够知道自己是否能够胜利。现在牌王想考考你,对于任何一个位置 k ,他能否胜利。
⏳Input:
第一行一个整数 T (1 < T< 1000)
接下去每行有一个字符串 s(1 <= |s| <= 1000),保证字符串 s 中仅包含小写字母。
🔑Output:
对于每个字符串s,输出|s|个数字,分别代表k=1,2,3,…,|s|时的答案,Yes(代表牌王胜利)或者No(牌王失败)
👨🏫 Sample Input:
3
cbabc
aaa
cba
💡Sample Output:
No
No
No
Yes
Yes
No
No
No
No
No
No
🙋思路
题目不难,理解了就可以了
其实就是左边能不能移动
如果可以向左边移动一次
那就是牌王赢了
如果不可以
那就是牌王输了
因为右移肯定是字典序变大(自己体会)
AC Code
#include <stdio.h>
#include <string.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
char str[1000];
scanf("%s",str);
int len =strlen(str);
for(int k=0;k<len;k++){
if(k == 0){ //只能右移 (肯定输)
printf("No\n");
}
else{
int i;
for(i=k;i>=0;i--){
if(str[i]<str[k])
break;
}
if(i == -1) //说明没办法左移
printf("No\n");
else
printf("Yes\n");
}
}
}
}