专栏文章
B4249【语言月赛202503】洗牌
B4249题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mip3izfk
- 此快照首次捕获于
- 2025/12/03 05:34 3 个月前
- 此快照最后确认于
- 2025/12/03 05:34 3 个月前

hi hi hi又是本蒟蒻,今天又来讲题啦!!!
本题难度为普及-,我用的是栈,没学习过的同学已经可以退出了,感谢点入
本题呢就是说:给张牌, 分成两堆,再根据字符串来放入新牌堆,最后奇数张给Alice就OK
先解决分堆问题:
我使用两个栈来模拟了两个牌堆:
| a牌堆 | b牌堆 |
|---|---|
| A1 | B1 |
| A2 | B2 |
| A3 | B3 |
//分成两半
A3 A2 A1 | B1 B2 B3
—— --> |
-- --> |
//变成表格
代码如下:
CPPfor (int i = n - 1; i >= 0; i -- ){
stk1.push(tmp[i]);
}
for (int i = l - 1; i >= n; i -- ){
stk2.push(tmp[i]);
}
接下来按照字符串顺序再放入一个栈就行啦,(有脑子就会)这里太太太简单,就直接看代码啦
代码如下:
CPPfor (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 条评论,欢迎与作者交流。
正在加载评论...