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