B4249【语言月赛202503】洗牌

· · 题解

hi hi hi又是本蒟蒻,今天又来讲题啦!!!

本题难度为普及-,我用的是,没学习过的同学已经可以退出了,感谢点入

本题呢就是说:给2n张牌, 分成两堆,再根据字符串来放入新牌堆,最后奇数张给Alice就OK

先解决分堆问题:

我使用两个栈来模拟了两个牌堆:

a牌堆 b牌堆
A1 B1
A2 B2
A3 B3

//分成两半

A3 A2 A1 | B1 B2 B3

—— --> |

-- --> |

//变成表格

代码如下:

for (int i = n - 1; i >= 0; i -- ){
    stk1.push(tmp[i]);
}
for (int i = l - 1; i >= n; i -- ){
    stk2.push(tmp[i]);
}

接下来按照字符串顺序再放入一个栈就行啦,(有脑子就会)这里太太太简单,就直接看代码啦

代码如下:

for (int i = 0; i < l; i ++ ){
    if (s2[i] == 'L'){
    stk3.push(stk1.top());
    if (!stk1.empty()) stk1.pop();
}
else{
    stk3.push(stk2.top());
    if (!stk2.empty()) stk2.pop();
    }
}

欧克,都这里核心就讲完了,手会了的可以退出啦,感谢阅读

脑子会了手没会的可以看看完整代码:

#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
const int N = 210;
int n, l, c = 0;
string s1, s2, s, tmp[N];
stack<string> stk1;
stack<string> stk2; 
stack<string> stk3;
int main(){
    cin >> n >> s1 >> s2;
    s1 += ',';
    l = s1.length();
    for (int i = 0; i < l; i ++ ){
        if (s1[i] == ','){
            tmp[c] = s;
            c ++ ;
            s = "";
        }
        else s += s1[i];
    }
    l = s2.length();
    for (int i = n - 1; i >= 0; i -- ){
        stk1.push(tmp[i]);
    }
    for (int i = l - 1; i >= n; i -- ){
        stk2.push(tmp[i]);
    }
    for (int i = 0; i < l; i ++ ){
        if (s2[i] == 'L'){
            stk3.push(stk1.top());
            if (!stk1.empty()) stk1.pop();
        }
        else{
            stk3.push(stk2.top());
            if (!stk2.empty()) stk2.pop();
        }
    }
    for (int i = 1; i <= l; i ++ ){
        if (i % 2 == 1){
            cout << stk3.top() << endl;
        }
        if (!stk3.empty()) stk3.pop();
    }
    return 0;
}

好,总结一下,本题看上去简单,实际上一点也不难,难点就两个:如何拆出卡片和分堆,剩下的都挺简单的,如果对本蒟蒻有代码建议的,本蒟蒻会采纳,没讲明白请在评论区艾特我,感谢各位读到这里,我们下次再见~