牛客小白月赛4-I-合唱队形 暴力

https://www.nowcoder.com/acm/contest/134/I

这是一道我打BUG打得颠狂地笑出来的题(其实是笑自己神经病)

题解:

1、统计妹子个数,放置后期处理溢出

2、给序列上的每个点染色(染成所属最长妹子序列长度)

3、对于每个男生点,判断两边颜色相加再+1,注意和妹子总数比较维护最小值,最长序列维护最大值就是答案

4、(颠狂点)边界情况,全是妹子,或者全是单身狗,或者嘴边上一个狗,其他全是妹子等情况。疯狂打补丁,颠狂地笑。

#include <bits/stdc++.h>
using namespace std;
int a[100005];

int main() {
    int n;
    string str;
    cin >> n;
    cin >> str;
    int tag = 0,res = 0,ma = 0;
    for(int i = 0;i < n;i++) {
        if(str[i] == '0') {
            a[i] = tag + 1;
            tag++;
            res++;
        }
        else tag = 0;
    }
    for(int i = n - 1;i >= 0;i--) {
        if(a[i] == 0)
            tag = 0;
        else {
            tag = max(tag,a[i]);
            a[i] = max(tag,a[i]);
        }
    }
    for(int i = 1;i < n - 1;i++) {
        if(str[i] == '1') {
            int cnt = a[i-1] + 1 + a[i+1];
            ma = max(cnt,ma);
            if(ma > res) ma = res;
        }
    }
    if(str[0] == '1') {
        int cnt = 1 + a[1];
        ma = max(cnt,ma);
        if(ma > res) ma = res;
    }
    if(str[n-1] == '1') {
        int cnt = a[n-2] + 1;
        ma = max(cnt,ma);
        if(ma > res) ma = res;
    }
    if(res == n) cout << n << endl;
    else cout << ma << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/a912952381/article/details/80717634
今日推荐