Educational Codeforces Round 97 (Rated for Div. 2)------Reverse Binary Strings

题目

在这里插入图片描述

题意

给你一个01字符串,可以对其中的一段进行翻转操作,问使字符串变成01交错的字符串至少需要多少次操作

题解

  • 翻转字符串不会改变翻转区间内的01关系,只会改变头和尾的关系,交换
  • 找到相邻的相同的作为头,然后往后找第一个相邻的相同的且与头不相同的作为尾
  • 翻转
    第一种思想属于暴利,复杂度有点高,会被卡超时,因此介绍第二种思想
  • 第二种思想,多出来的连续的0或1的区间长度之和的最大值

AC代码

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    int t; cin >> t;
    int n; string s;
    while(t--){
        cin >> n >> s;
        int vis[5];
        vis[0] = vis[1] = 0;
        for(int i = 0; i < n; i++){
            if(s[i] == s[i + 1]) {
                for (int j = i; j <= n; j++) {
                    if (s[j] != s[i]){
                        vis[s[i] - '0'] += (j - i - 1);
                        i = j - 1;
                        break;
                    }
                }
            }
        }
        //cout << vis[0] << vis[1] << endl;
        cout << max(vis[0], vis[1]) << endl;
    }
    return 0;
}
posted @ 2020-11-07 09:44  AC_沫离  阅读(28)  评论(0)    收藏  举报