题解 CF1437B 【Reverse Binary Strings】

解题思路

明确题意:我们要用最少的操作将 \(0 1\) 串变得 \(0\) \(1\) 相间。

首先,我们可以将任意一个子序列翻转。显而易见,我们每次只能使一对相邻的相同数字分开,即 \(00\)\(11\)

所以,我们只需要统计有多少对相邻的相同数字即可。(因为 \(0\)\(1\) 相互匹配,所以 相邻的 \(0\) 的对数 和 相邻的 \(1\) 的对数 要分开计数,最后答案取最大值。)

Code

看代码可能更好理解。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int t,n;
int main()
{
	cin>>t;
	while(t--)
	{
		string s;
		cin>>n;
		cin>>s;
		int ans=0,anss=0;
		for(int i=0;i<n;i++)
		{
			if(s[i]=='1'&&s[i+1]=='1') ans++;
			if(s[i]=='0'&&s[i+1]=='0') anss++;
		}	
		cout<<max(ans,anss)<<endl;
	}
	return 0;
}
posted @ 2020-12-01 22:32  -lala-  阅读(117)  评论(0编辑  收藏  举报