本文主要是介绍Codeforces Contest 1191 E ——博弈,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
This way
题意:
现在有一个01串,并且有一个操作是将一个区间翻转成同样的字符,现在有两个人轮流翻转,问你最后谁赢
题解:
如果第一个人要赢,那么只能在第一次的时候赢,如果第二个人要赢,也只能在他第一次翻转的时候赢,否则他们就能够给对方造成无法取胜的局势,如此往复。
那么第一个人赢必然是某个区间翻转之后全部变成相同的,那么可以通过开头连续相同的字符和结尾连续相同的个数来判断。
如果第一个人无法赢,那么他会给第二个人造成最劣的局势,什么是最劣的局势,就是连续的k个数的两边的数与更旁边的数不同:
就是这种情况。
那么也就是说最旁边的数的个数需要大于等于n-k-1,这样就能保证最多一边是不同的
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
char s[N];
int main()
{int n,k;scanf("%d%d",&n,&k);scanf("%s",s);int sta=0,en=0;for(int i=0;s[i]==s[0]&&i<n;i++)sta++;for(int i=n-1;s[i]==s[n-1]&&~i;i--)en++;if(sta+k>=n||en+k>=n||(s[0]==s[n-1]&&sta+en+k>=n))return 0*printf("tokitsukaze\n");if(sta>=n-k-1&&en>=n-k-1&&k*2>=n)return 0*printf("quailty\n");return 0*printf("once again\n");
}
这篇关于Codeforces Contest 1191 E ——博弈的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!