牛客小白月赛96 B-最少操作次数 题型:分类讨论

67 阅读2分钟

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;
}