人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上,做成大大小小的松枝。他们的工作流程(并不)是这样的:
(1)小盒子已经满了,但推送器上取到的松针仍然不满足要求。此时将手中的松枝放到成品篮里,推送器上取到的松针压回推送器,开始下一根松枝的制作。
(2)小盒子中最上面的松针不满足要求,但推送器上已经没有松针了。此时将手中的松枝放到成品篮里,开始下一根松枝的制作。
(3)手中的松枝干上已经插满了松针,将之放到成品篮里,开始下一根松枝的制作。
现在给定推送器上顺序传过来的 N 片松针的大小,以及小盒子和松枝的容量,请你编写程序自动列出每根成品松枝的信息。
输入在第一行中给出 3 个正整数:N(≤103),为推送器上松针片的数量;M(≤20)为小盒子能存放的松针片的最大数量;K(≤5)为一根松枝干上能插的松针片的最大数量。
随后一行给出 N 个不超过 100 的正整数,为推送器上顺序推出的松针片的大小。
每支松枝成品的信息占一行,顺序给出自底向上每片松针的大小。数字间以 1 个空格分隔,行首尾不得有多余空格。
8 3 4
20 25 15 18 20 18 8 5
20 15
20 18 18 8
25 5
代码长度限制
16 KB
Java (javac)
时间限制
500 ms
内存限制
64 MB
其他编译器
时间限制
400 ms
内存限制
64 MB
#include<bits/stdc++.h>
using namespace std;
int n, m, k;
queue<int>b;//模拟推送器
stack<int>c;模拟小盒子
int main()
{
cin >> n >> m >> k;
for (int i = 0; i < n; i++)
{
int o;
cin >> o;
b.push(o);
}//推送器的都弄进去
while(b.size()||c.size())//边缘条件,俩个盒子都没有那个树枝了
{
vector<int> t;//模拟手上的松枝
int s;//下面俩个是插第一个的方法
if (!c.empty())
{
s = c.top();
c.pop();
t.push_back(s);
}
else if (!b.empty())
{
s = b.front();
b.pop();
t.push_back(s);
}
while(1)//死循环,有他说的条件就跳出
{
if (!c.empty() && c.top() <= t.back())
{
s = c.top();
c.pop();
t.push_back(s);
}
else if (!b.empty() && b.front() <= t.back())
{
s = b.front();
b.pop();
t.push_back(s);
}
else if (!c.empty()&&c.top() > t.back() && b.empty())
break;
else if (c.size() < m && b.front() > t.back())
{
s = b.front();
b.pop();
c.push(s);
}
else if (c.size() == m && b.front() > t.back())
break;
if (b.empty() && c.empty())
break;
else if (t.size() == k)
break;
}
for (int t1 = 0; t1 < t.size(); t1++)
{
cout << t[t1];
if (t1 != t.size() - 1)cout << " ";
else cout << endl;
}
}
return 0;
}
阅读理解真难
因篇幅问题不能全部显示,请点此查看更多更全内容