atcoder_abc_447D惨烈实况

被自己蠢哭了

本人蒟蒻,也许是因为是D题所以想的有点多了,如果放在B题的话说不定就。。。。。

code(没事找事版本,就是我自己调了半天的版本)

void solve() {
    string s;cin>>s;
    s=" "+s;
    deque<int>back_char;
    deque<int>cnt_b;
    int ans=0;
    for(int i=1;i<=(int)s.length();i++){
        if(s[i]!='B'&&s[i]!='C'){
        back_char.pb(i);
       //while(!cnt_b.empty()&&cnt_b.front()<back_char.front())cnt_b.pof();
       //这个while本来在这里的
       //反面例子:
       /*
       A B B A C C
       正确答案是1,但是你如果把while放在这里的话,第一个A1和B2配对正常
       但是第二个A4和B3配对就不对了,A是要在B后面的才对,
       但是你如果把while放在这个里面的话,只有碰到A了才会检查
       可是后面没有A了,也就是这个不合法的没有被清楚掉,依然留在这里
       */
        }
        else if(s[i]=='B'&&!back_char.empty()&&i>back_char.front())cnt_b.pb(i);
        else{
            //如果是放在这里就对了,你的逻辑本来就该是这样的,
            //在碰到C的时候,也就是最后面的这个的时候,把不合法的去掉
            while(!cnt_b.empty()&&cnt_b.front()<back_char.front())cnt_b.pof();
            if(back_char.size()>0&&cnt_b.size()>0){
                ans++;
                cnt_b.pof();
                back_char.pof();
            }
        }
    }
    cout<<ans<<endl;
}

几经波折的db之路

样例给的极具迷惑性,第零版在vscode上和atcoder上跑出来的结果不一样,结果是代码中写了未定义的行为,在自己的vscode上能跑出AC闹麻了,我第一版的就是直接过了所有的样例,但是错了,然后又改,然后新加了一个样例,第二版也是过了全部的样例,包括前面新加的样例,但是又WA了,然后后面又加了一个deque,在atcoder上还是WA了,但是就差三个测试点,后来又改了好久,发现是while的位置有问题,改了位置之后就直接AC了

真正的好解法

void solve2() {
    string s;
    cin >> s;
    int num_a = 0;  // 记录当前手头有多少个单身的 'A'
    int num_ab = 0; // 记录当前手头有多少个拼好的 "AB"
    int ans = 0;    // 记录拼成的 "ABC"
    for (char c : s) {
        if (c == 'A') {
            num_a++;      // 获得一个 A
        } 
        else if (c == 'B') {
            if (num_a > 0) { // 前面有 A 才能拼成 AB
                num_a--;     
                num_ab++;    
            }
        } 
        else if (c == 'C') {
            if (num_ab > 0) { // 前面有 AB 才能拼成 ABC
                num_ab--;     
                ans++;        
            }
        }
    }
    cout << ans << endl;
}

在顺着自己的思路写了半天后看到了这个解法,顿时觉得......感觉还是得继续训练

posted @ 2026-03-12 23:18  Time_q  阅读(1)  评论(0)    收藏  举报