洛谷 AT_agc063_a [AGC063A] Mex Game 题解

前言

这道题翻译没有给出 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 数组中 AB 出现的次数,若 s u m a ≥ s u m b sum_a \ge sum_b sumasumb,输出 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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值