题目
题目描述
样例输入
8 3 4 20 25 15 18 20 18 8 5
样例输出
20 15 20 18 18 8 25 5
浅谈总结
这里我就放上截图吧,在开始写题解之前我想先写一下我的感受,我没有想到最后自己的天梯赛的结果竟然是这样,我在这道题上纠结了将近一个半小时。事后老师建立起复现赛之后我根据当时的代码稍微改了一下,交了之后过了,当时只过了一分,可能还是我自己能力不足吧。 虽然竞赛结束了,但是人生并没有结束,但我觉得重要的并不是拿不拿奖,是能不能从这样一次次的实践中收获经验和教训吧,以后我会引以为戒,也希望能看到这篇文章的各位能引以为戒。 我觉得最主要的点还是要正确地模拟这个过程,具体要使用的是while还是if是需要好好想一下的,而不能想当然的就写了上去。 具体需要注意的地方我都写到代码的注释里了。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=100005;
int n,m,k,s;
int u,v,w;
queue<int> qus[1005];
stack<int> he;
queue<int> qu;
int main()
{
int zan;
cin>>n>>m>>k;
for(int i=1; i<=n; i++)
{
cin>>zan;
qu.push(zan);
}
for(int i=0; i<=1000; i++)
{
qus[i].push(200);
}
int cnt=0;
zan=0;
while(true)
{
if(qu.empty()&&he.empty())
{
cnt++;
break;
}
if((int)qus[cnt].size()==(k+1))
cnt++;
if(!he.empty())
{
zan=he.top();
if(zan>qus[cnt].back())
{
if(qu.empty())
cnt++;
while(!qu.empty())
{
zan=qu.front();
if(zan<=qus[cnt].back())
{
qus[cnt].push(zan),qu.pop();
break;
}
else if((int)he.size()<m)
he.push(zan),qu.pop();
else
{
cnt++;
break;
}
}
}
else
{
he.pop();
qus[cnt].push(zan);
}
}
else
{
while(!qu.empty())
{
zan=qu.front();
if(zan<=qus[cnt].back())
{
qus[cnt].push(zan),qu.pop();
break;
}
else if((int)he.size()<m)
he.push(zan),qu.pop();
else
{
cnt++;
break;
}
}
}
}
for(int i=0; i<cnt; i++)
{
qus[i].pop();
cout<<qus[i].front();
qus[i].pop();
while(!qus[i].empty())
{
cout<<" "<<qus[i].front();
qus[i].pop();
}
cout<<endl;
}
return 0;
}
|