B-最少操作次数_牛客小白月赛96 (nowcoder.com)
思想
刚开始想复杂了,这道题的思路是这样的:
首先我们要知道给定的字符串中不会只包含1,或者只包含0,而是01都包含.
如果n的数量只有2的话 那么字符串中1的个数和0的个数相等,没有办法变
如果字符串中0和1的数量相等,此时整体上1的个数和0的个数相等
我们需要先找一段区间,满足这段区间1的个数大于0的数,此时可以把这段区间所有1全变为0
现在整体上0的个数就大于1的个数了,就把所有的1全部变为0
如果某一段子区间中没有1或者没有0,那么此时这段子区间就不需要操作,直接输出:"0"
如果某一段区间内1的个数不等于0的个数,且n的长度不为2.那么说明至少1的个数要大于0的个数,或者0的个数大于1的个数,那么就可以把这段子区间全部变为1或者变为0,只需要操作1步
#include<bits/stdc++.h>
using namespace std;
int cnt0,cnt1;
int main()
{
int n;string s;
cin>>n>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]=='0') cnt0++;
else cnt1++;
}
//如果数量相等,此时整体上1的个数和0的个数相等
//需要先找一段区间,满足这段区间1的个数大于0的数,此时可以把这段区间所有1全变为0
//现在整体上0的个数就大于1的个数了,就把所有的1全部变为0
//一共需要2步
if(cnt0==cnt1)
{
//只有2的话 1的个数和0的个数相等,没有办法变
if(s.size()==2) cout<<-1;
else cout<<2<<endl;
}
else if(cnt0==0 || cnt1==0)
{
cout<<0<<endl;
}
else cout<<"1";
return 0;
}