题目大意:可以任意切割给定序列,对于任意序列,其MEX值等于该序列未出现的最小整数,求给定序列的最小的总MEX值,即所有切割后序列的MEX值之和
思路:我个人做这个题时分了三种情况,首先全1不用说,怎么都是0,全0的话越切越大,所以必然是1,所以这题就成了处理01混搭的序列,而对最小值最有影响的是0,因为一旦单分出0,MEX值就要+1,所以自然想到指针的思想遍历序列,但这里需注意,找的是连续的0片段数量,不然最终求的MEX值必然大于等于最小值。
Code:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
string s;
void solve()
{
cin>>s;
int cnt0=0,cnt1=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='0') cnt0++;
else
cnt1++;
}
if(!cnt1)
{
cout<<1<<endl;
return;
}
if(!cnt0)
{
cout<<0<<endl;
return;
}
int i=0,j=0;
int cnt=0;
while(i<s.size())
{
while(s[i]=='1') i++;
if(i>=s.size()) break;
cnt++;
while(s[i]=='0') i++;
if(i>=s.size()) break;
}
if(cnt<2)
{
cout<<1<<endl;
return;
}
cout<<2<<endl;
return;
}
int main()
{
int _;
scanf("%d",&_);
for(int i=0;i<_;i++) solve();
return 0;
}