专栏文章

B4249【语言月赛202503】洗牌

B4249题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mip3izfk
此快照首次捕获于
2025/12/03 05:34
3 个月前
此快照最后确认于
2025/12/03 05:34
3 个月前
查看原文
hi hi hi又是本蒟蒻,今天又来讲题啦!!!
本题难度为普及-,我用的是,没学习过的同学已经可以退出了,感谢点入
本题呢就是说:给2n2n张牌, 分成两堆,再根据字符串来放入新牌堆,最后奇数张给Alice就OK
先解决分堆问题:
我使用两个栈来模拟了两个牌堆:
a牌堆b牌堆
A1B1
A2B2
A3B3
//分成两半
A3 A2 A1 | B1 B2 B3
—— --> |
-- --> |
//变成表格
代码如下:
CPP
for (int i = n - 1; i >= 0; i -- ){
    stk1.push(tmp[i]);
}
for (int i = l - 1; i >= n; i -- ){
    stk2.push(tmp[i]);
}
接下来按照字符串顺序再放入一个栈就行啦,(有脑子就会)这里太太太简单,就直接看代码啦
代码如下:
CPP
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();
    }
}
欧克,都这里核心就讲完了,手会了的可以退出啦,感谢阅读
脑子会了手没会的可以看看完整代码:
CPP
#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;
}
好,总结一下,本题看上去简单,实际上一点也不难,难点就两个:如何拆出卡片和分堆,剩下的都挺简单的,如果对本蒟蒻有代码建议的,本蒟蒻会采纳,没讲明白请在评论区艾特我,感谢各位读到这里,我们下次再见~

评论

0 条评论,欢迎与作者交流。

正在加载评论...