样例输出8 3 4
20 25 15 18 20 18 8 5
浅谈总结20 15
20 18 18 8
25 5
这里我就放上截图吧,在开始写题解之前我想先写一下我的感受,我没有想到最后自己的天梯赛的结果竟然是这样,我在这道题上纠结了将近一个半小时。事后老师建立起复现赛之后我根据当时的代码稍微改了一下,交了之后过了,当时只过了一分,可能还是我自己能力不足吧。
虽然竞赛结束了,但是人生并没有结束,但我觉得重要的并不是拿不拿奖,是能不能从这样一次次的实践中收获经验和教训吧,以后我会引以为戒,也希望能看到这篇文章的各位能引以为戒。
我觉得最主要的点还是要正确地模拟这个过程,具体要使用的是while还是if是需要好好想一下的,而不能想当然的就写了上去。
具体需要注意的地方我都写到代码的注释里了。
#include
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;
}
/*
8 3 4
20 25 15 18 20 18 8 5
*/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)