求助,wawawa
查看原帖
求助,wawawa
501304
73⑦③73楼主2023/4/4 15:08

这个题确实是分类讨论,分类讨论后

以下代码在洛谷一个点也过不了,蓝桥杯可以过7/11个点,C语言网莫名其妙超时

分类讨论哪里出错了QWQ

#include <bits/stdc++.h>

using std::cin;
using std::cout;

typedef long long ll;

int Solve(int o_ow, int wo_o, int o_o, int wo_ow, int o_, int _o, int wo_, int _ow, int w) {
    int c1 = 0, c2 = 0, c3 = 0, c4 = 0, c5 = 0, ans = 0, z = 0;
    if (o_ow > 0) {
        c1 += 1;
        ans += o_ow;
        o_ow = 0;
    }
    if (wo_o > 0) {
        c2 += 1;
        ans += wo_o;
        wo_o = 0;
    }
    if (o_o > 0 || wo_ow > 0) {
        c1 = c2 = 0;
    }
    if (o_o > 0 && wo_ow > 0) {
        c3 = 1;
        z = std::min(o_o, wo_ow);
        ans += z * 2;
        o_o -= z;
        wo_ow -= z;
        if (o_o > 0 || wo_ow > 0) {
            c3 = 0;
        }
    }
    if (o_o > 0 && o_o <= w) {
        c4 = 1;
    }
    if (_ow > 0 || o_ > 0) {
        c1 = 0;
    }
    if (_o > 0 || wo_ > 0) {
        c2 = 0;
    }
    if (_ow > 0 || o_ > 0 || wo_ > 0 || _o > 0) {
        c3 = c4 = 0;
    }
    if (o_o > 0) {
        _o += o_o;
        o_ += o_o;
    }
    if (wo_ow > 0) {
        _ow += wo_ow;
        wo_ += wo_ow;
    }
    o_o = wo_ow = 0;
    z = std::min(_o, wo_);
    _o -= z;
    wo_ -= z;
    ans += z;
    z = std::min(_ow, o_);
    _ow -= z;
    o_ -= z;
    ans += z;
    z = std::min({_o, o_, w});
    ans += z;
    return ans - c1 - c2 - c3 - c4 - c5;
}

int Check(std::string str) {
    int cnt = 0;
    for (int i = 0; i < (ll) str.length() - 2; ++i) {
        if (str[i] == 'o' && str[i + 1] == 'w' && str[i + 2] == 'o') {
            ++cnt;
        }
    }
    return cnt;
}

int main() {
    std::ios::sync_with_stdio(false);
    //freopen("01.in", "r", stdin);
    int o_ow = 0, wo_o = 0, o_o = 0, wo_ow = 0, o_ = 0, _o = 0, wo_ = 0, _ow = 0, w = 0;
    int n, base_ans = 0;
    cin >> n;
    std::string str_tot = "0";
    for (int i = 0; i < n; ++i) {
        std::string str;
        cin >> str;
        str_tot += str;
        base_ans += Check(str);
        int len = str.length();
        if (len == 1) {
            if (str[0] == 'w') {
                w += 1;
            } else if (str[0] == 'o') {
                o_o += 1;
            }
        } else if (str[0] == 'o') {
            if (str[len - 1] == 'o') {
                o_o += 1;
            } else if (str[len - 2] == 'o' && str[len - 1] == 'w') {
                o_ow += 1;
            } else {
                o_ += 1;
            }
        } else if (str[0] == 'w') {
            if (str[1] == 'o' && str[len - 1] == 'o') {
                wo_o += 1;
            } else if (str[1] == 'o' && str[len - 2] == 'o' && str[len - 1] == 'w') {
                wo_ow += 1;
            } else if (str[1] == 'o') {
                wo_ += 1;
            }
        } else if (str[len - 1] == 'o') {
            _o += 1;
        } else if (str[len - 2] == 'o' && str[len - 1] == 'w') {
            _ow += 1;
        }
        cout << Solve(o_ow, wo_o, o_o, wo_ow, o_, _o, wo_, _ow, w) + base_ans << "\n";
    }
    return 0;
}
2023/4/4 15:08
加载中...