题目链接:https://vjudge.net/contest/396831#problem/B
题解:判断经过多少步1变成0或者0变成1的转换可以不出现101,010这样的序列。
即只出现全是0,或者全是1,或者一边全是0,一边全是1的序列。循环0的终点即可,然后在从开头循环到终点判断第一个数,从终点+1序列循环到字符串的终点判断第二个数需要变化的次数,然后综合四次取最小值即可。
代码:
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#define INF 1000000000
using namespace std;
int main()
{
string s;
int t;
scanf("%d",&t);
while(t--)
{
cin>>s;
int ans1=0;//全变成1
for(int i=0; i<s.length(); i++)
if(s[i]!='1')
ans1++;
int ans0=0;//全变成0
for(int i=0; i<s.length(); i++)
if(s[i]!='0')
ans0++;
//变成一半0,一半1
int ans01=0,anss=INF;
for(int endd=0; endd<s.length(); endd++) //0的终点
{
ans01=0;
for(int i=0;i<=endd;i++)//从前往后
if(s[i]!='0')
ans01++;
for(int beginn=endd+1; beginn<s.length(); beginn++)
{
if(s[beginn]!='1')
ans01++;
}
anss=min(ans01,anss);
}
//变成一半1,一半0
int ans10=0,ansa=INF;
for(int endd=0; endd<s.length(); endd++) //1的终点
{
ans10=0;
for(int i=0;i<=endd;i++)
if(s[i]!='1')
ans10++;
for(int beginn=endd+1; beginn<s.length(); beginn++)
{
if(s[beginn]!='0')
ans10++;
}
ansa=min(ans10,ansa);
}
cout<<min(ans1,min(ans0,min(anss,ansa)))<<endl;
}
return 0;
}