用is_first特判一下,第一个数不输出空格,后面先输出空格,再输出数,这样输出完最后一个数后,就不会有空格
第4472题
#include <iostream>
#include <cstring>
#include <algorithm>
#include<stack>
#include<queue>
using namespace std;
const int N = 1e5;
queue<int>q;
stack<int>stk;
vector<int>a;
int main()
{
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
int b;
cin>>b;
q.push(b);
}
while(q.size()||stk.size())//还有松针片或栈不空
{
int cnt=0,last=1000;//当前松针里包含松针片的数量,用last维护降序排列
bool is_first=true;//改成第一个数不输出空格,后面先输出空格再输出数
while(cnt<k)
{
if(stk.size()&&stk.top()<=last)//如果栈里有元素并且栈顶元素小于last
{
if(is_first)is_first=false;
else cout<<" ";
cout<<stk.top();
last=stk.top();
stk.pop();//出栈
cnt++;
}
else if(q.size())//去队列中拿
{
int t=q.front();
if(t<=last)//如果队头小于last
{
if(is_first)is_first=false;
else cout<<" ";
cout<<t;
last=t;
q.pop();
cnt++;
}
else if(stk.size()<m)//队头元素大于last,把队头元素放到栈中,如果栈没满
{
stk.push(t);
q.pop();
}
else break;//如果栈满就break
}
else break;//栈里不能取,队列空了,也break
}
cout<<endl;
}
return 0;
}
//传送带就是队列,盒子就是栈
//先从栈里拿,栈里没有就从队列中拿,如果队头不满足要求,就把队头放到栈中,再看队列中的下一个
//从下往上是单调递减的,上面的不能比下面的大
//第一个是松针片的数量,第二个是栈的容量,每个松针最多能放几个松针片
//先拿20,25比20大,把25放到栈中,拿15,18放到栈中,20放到栈中,栈满了,18不能放到栈中,这样就拼完一个了,第一个松针是20 25