题目
这道题属于是没看明白题意,翻译搞了半天一脸懵逼,看赛后的视频讲解还是一脸懵逼
盯着题愣了半天才悟出来咋回事…
题意
有一个mex规则,在一串二进制数中,只有0为1,只有1位0,而都有则为2。
给若干个二进制代码,把它分解成若干子串,使子串mex的总和最小。
分析
由题意可见一个串最大的mex为2,所以这道题不会出现2以上的输出。
一个或一串0的mex为1,而一串1的mex为0。那么把原串分解成若干串0和若干串1的集合,最后和2比较即可。
Talk is cheap
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
string str;
cin>>str;
char a=str[0];//检验交界的字符,初值赋第一个数
int ans=0;
//这里的定义写的属实有点乱了
for(int i=1;i<str.size();i++)//从第二个数开始遍历串
{
if(str[i]==a) continue;//等于上一个无事发生
else
{
if(str[i]=='1')//前0后1的情况,一串0结束一串1开始
{
ans++;//一串0的mex是1
a='1';//换字符
}
else//前1后0的情况,一串1结束一串0开始
{
//一串1的mex是0,答案无事发生
a='0';//换字符
}
}
}
if(a=='0') ans++;//如果以一串0结束,那么答案要+1
if(ans>2) cout<<2;//如果结果大于2还不如不切
else cout<<ans;//小于等于2输出答案
cout<<endl;
}
return 0;
}