分析:这是一道模拟题。可以用队列和栈一起来模拟,当然也可以像我一样用数组和栈来模拟。这题的话我们基本上按照他给的描述一直写代码就可以了,但是要注意的是在后续的处理中判断一下我们的松枝是否为空,否则就会一直T(1、3、5)这三个测试点,代码里有标注的。
PS:
如果这题出现了超时的情况,肯定是你代码里该退出循环的时候没退出,该continue的时候没用continue,或者说是出现了栈、队列、vector本身是空的但是你访问并进行了操作,即非法访问。
答案错误的话那就好好读题了,大概率是代码里面的各种操作优先级出错了。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4+10;
int n,m,k,cnt;
int a[maxn];
stack<int> st;
vector<int> v;
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n >> m >> k;
for(int i=1; i<=n; i++) cin >> a[i];
while(cnt<n){
//新的松枝
if(v.size()==0){
if(st.size()==0) v.push_back(a[++cnt]);
else{
v.push_back(st.top());
st.pop();
}
continue;
}
//不是新的松枝
else{
//如果松枝满了
if(v.size()==k){
for(int i=0; i<v.size(); i++){
if(i!=0) cout << " ";
cout << v[i];
}
cout << endl;
v.clear();
continue;
}
//如果松枝没有满
int kx=v.size()-1;
//盒子最上面的符合要求
if(st.size()!=0&&st.top()<=v[kx]){
v.push_back(st.top());
st.pop();
continue;
}
//盒子顶层不符合要求而传送带符合
else if(a[cnt+1]<=v[kx]){
v.push_back(a[++cnt]);
continue;
}
//两个都不符合
else{
//盒子的容量满了,不能再放
if(st.size()==m){
for(int i=0; i<v.size(); i++){
if(i!=0) cout << " ";
cout << v[i];
}
cout << endl;
v.clear();
continue;
}
//盒子里还能放松枝
else{
st.push(a[++cnt]);
continue;
}
}
}
}
//还未插满
if(v.size()!=0){
//此时传送带上的已经全部到盒子里了
while(!st.empty()){
//如果松枝已满
if(v.size()==k){
for(int i=0; i<v.size(); i++){
if(i!=0) cout << " ";
cout << v[i];
}
cout << endl;
v.clear();
continue;
}
//如果松枝未满
else{
int kx=v.size()-1;
//注意下面这一步,一定不能省!!! 否则会T掉1、3、5这三个测试点
if(kx==-1){
v.push_back(st.top());
st.pop();
continue;
}
//盒子顶符合要求
if(st.top()<=v[kx]){
v.push_back(st.top());
st.pop();
continue;
}
//盒子顶不符合要求
else{
for(int i=0; i<v.size(); i++){
if(i!=0) cout << " ";
cout << v[i];
}
cout << endl;
v.clear();
continue;
}
}
}
//处理剩下的或者说是盒子里已经没有松枝的情况
if(v.size()!=0){
for(int i=0; i<v.size(); i++){
if(i!=0) cout << " ";
cout << v[i];
}
cout << endl;
v.clear();
}
}
return 0;
}