Mex Game【Atcoder】

题目:题目链接

题目大意

题目描述

        你得到一个长度为 N+1N+1 的字符串,由AB组成:S=S0⋯SN。对于每个k=1,…,N,解决以下问题。

        Alice和Bob将使用集合X进行游戏,该集合最初为空。对于t=1,…,k,按此顺序,他们将执行以下操作:

        如果t是奇数,则Alice将选择一个非负整数x,并将X替换为X∪{x};

        如果t是偶数,Bob将选择一个非负整数x,并将X替换为X∪{x}。

        在所有k次操作之后让x成为mex(X)。如果字母Sx是A,则Alice获胜;如果Sx是B,则Bob获胜。注意X最多有k个元素,所以x=mex(X)≤k和字符Sx存在。

        当两个玩家都做出最优选择时,打印赢家的名字。

        对于由非负整数组成的有限集合X,mex(X)是使得x∉X的最小非负整数x。

输入格式

为以下格式:

N
S

N的范围为:1≤N≤2e5;S是长度为N+1的字符串,由AB组成。

输出格式

打印N行。当两个玩家在游戏中以k=i进行最佳游戏时,第i行应该包含赢家的名字(AliceBob)。

测试样例

样例一:

输入

2
ABB

输出

Alice
Bob

样例二:

输入

4
AAAAA

输出

Alice
Alice
Alice
Alice

样例三:

输入

7
BBAABABA

输出

Bob
Bob
Alice
Bob
Alice
Bob
Alice

题目分析

        这个题目中,Alice和Bob轮流选择字符串中的元素,到结束时只会剩下一个。而最终决定胜负的也就是mex(X)这一个元素,我们此时已不用考虑它定义中的最大最小,因为只剩下了一个元素,就是mex(X)。我们也就可以把题目转换为,双方轮流划去串中的元素,最终剩下的是A则Alice胜,反之Bob胜。

        显然,对于Alice来讲每一步的最优策略便是划去B,Bob则是划去A。那么这个博弈的胜方便很明了了,若是字符串中A比B多,则Alice胜,B比A多则Bob胜,一样多则Alice胜,因为她先手。

于是我们便能得到以下答案:

代码

#include<bits/stdc++.h>
using namespace std;

int n;
char s[200005];

int main() {
    int numa=0;//统计串中A的数量
    cin>>n;
    cin>>s[0];
    if (s[0]=='A')numa++;
    for (int i=1;i<=n;i++) {
        cin>>s[i];
        if (s[i]=='A')numa++;
        if (numa>=i+1-numa)cout<<"Alice\n";//A多或A、B一样多,Alice胜
        else cout<<"Bob\n";//Bob胜
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值