前言
这道题翻译没有给出 m e x \mathrm{mex} mex 函数的定义,那么我在此解释一下
对于由非负整数构成的有限集合 X X X,将满足 x ∉ X x \notin X x∈/X 的最小非负整数 x x x 定义为 m e x ( X ) \mathrm{mex}(X) mex(X)。
思路
因为 m e x ( X ) \mathrm{mex}(X) mex(X) 的定义是一个不在 X X X 集合里的一个最小非负整数,所以每回合插入的这个数 a a a 一定不会是 m e x ( X ) \mathrm{mex}(X) mex(X),那么这回合的最终得到的字母 s x s_x sx 一定不会是 s a s_a sa,所以对于两人而言,每一次插入没出现过的第一个对方名字的下标是最优操作。
例如 Alice
会插入没出现过的第一个 B
的下标,Bob
会插入没出现过的第一个 A
的下标,
这会让对方的胜利次数变小。而对于每回合来说,两人都会插入对方名字的下标,所以我们要比较次数,即
s
s
s 数组中 A
和 B
出现的次数,若
s
u
m
a
≥
s
u
m
b
sum_a \ge sum_b
suma≥sumb,输出 Alice
,否则输出 Bob
即可解出这道题。
AC Code
#include<bits/stdc++.h>
using namespace std;
signed main(){
int n;
cin>>n;
string s;
cin>>s;
int suma=0,sumb=0;
for(int i=0;i<=n;++i)
{
if(s[i]=='A') suma++;
else sumb++;
if(i==0) continue;
//一定要continue,不然会死得很惨,还好题解区有大佬和我一样是从0开始的,不然我还要调几小时
if(suma>=sumb)cout<<"Alice"<<endl;
else cout<<"Bob"<<endl;
}
}