天梯赛L2-041 插松枝
题目详情:
思路:
就是一个模拟题,但是要分清楚情况,可以在草稿纸上,把情况列一下,然后上手编代码,防止遗忘情况。可以用队列表示推送器,比数组方便一点,盒子的模拟肯定是用栈比较方便。
详细代码:
#include<bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
#define fi first
#define se second
#define pb push_back
#define db double
#define sc scanf
#define pf printf
using namespace std;
const int maxn = 1e5 + 10;
const int mod = 1e9 + 7;
int n, m, k;
stack<int> st;
queue<int> q;
int main() {
cin>>n>>m>>k;
for(int i = 0; i < n; ++i) {
int x; cin>>x; q.push(x);
}
while(1) {
int flag = 0; //盒子满了,但松枝没有
vector<int> v;//松枝
while(1) {
if(v.empty()) {//松枝是空的时候
//先从盒子里拿
if(!st.empty()) {
v.pb(st.top()); st.pop();
}
//盒子空了,再从推送器上拿
else if(!q.empty()) {
v.pb(q.front()); q.pop();
}
//都空了,结束
else {
break;
}
}
else {
//先从盒子里拿,并且需要满足条件
if(!st.empty() && st.top() <= v.back() ) {
v.pb(st.top()); st.pop();
}
else {
//盒子不满足条件了,再从推送器上拿,盒子满的时候要退出循环
while(!q.empty() && st.size() <= m) {
int t = q.front();
if(t <= v.back()) {
v.pb(t); q.pop(); break;
}
else {
if(st.size() == m) {
flag = 1;//盒子满了,标记一下,进入下一次循环
break;
}
else {
q.pop();
st.push(t);
}
}
}
if( q.empty() && (st.empty() || st.top() > v.back())){//对应第二种情况
break;
}
}
}
if( flag || v.size() == k ){
break;
}
}
for(int i = 0; i < v.size(); ++i) {
if(i) cout<<' ';
cout<<v[i];
}
cout<<endl;
if(q.empty() && st.empty()){
break;
}
}
}
知识总结:
模拟题心不慌,手不抖,把情况列下来,即可。