人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上,做成大大小小的松枝。他们的工作流程(并不)是这样的:
(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
-
注意:
1、思路都在注释里,明确盒子里的叶子优先与推送器里的叶子。
2、 首先分叶子是否为空,再分析叶子为空的时候和叶子不为空的时候。
3、叶子为空时,先判断盒子为不为空,为空则接推送器里的,不为空则接盒子里的。
4、叶子不为空时
4.1、先判断叶子是否满了,满了则跳出循环,开新的枝叶。
4.2、同样先判断盒子为不为空。
4.3、盒子不空时:
4.3.1、先判断盒子是否满了且推送器不满足接到枝叶上,则跳出循环,开新枝叶。 4.3.2、盒子不满的时候:判断盒子顶部叶子是否满足接到枝叶上
4.3.3、满足,则盒子顶部叶子接到枝叶上。
不满足,则判断推送器为不为空,为空则跳出循环,开新枝叶。不为空,则判断推送器能不能接到枝叶上,能则接,不能放到盒子里。
4.4、盒子为空,先判断推送器是否为空,为空则结束循环。不为空,判断推送器能不能接到枝叶上,能则接,不能放在盒子里。
5、最后输入,每个枝叶最后一个数据后面不接空格。盒子与推送器为空,结束循环。
- #include
- #include
- #include
- using namespace std;
- int main()
- {
- queue<int> tui;
- stack<int> he;
- int n, m, k;
- cin >> n >> m >> k;
- for (int i = 0; i < n; i++)
- {
- int t;
- cin >> t;
- tui.push(t);
- }
- while (!tui.empty() || !he.empty())//推送器和盒子都为空,跳出循环
- {
- queue<int> ye;
- while (1)
- {
- if (ye.empty())//叶子是空的
- {
- if (he.empty())//先看盒子是空的
- {
- ye.push(tui.front());//叶子从推送器拿
- tui.pop();
- }
- else//推送器是空的
- {
- ye.push(he.top());//叶子从盒子里拿
- he.pop();
- }
- }
- else//叶子不为空
- {
- if (ye.size() == k)//叶子满了,下一个枝叶
- break;
- if (!he.empty())//盒子不空
- {
- if (he.size() == m && tui.front() > ye.back())//盒子满了且推送器第一个大于叶子最上面一个,换下一个枝叶
- break;
- if (he.top() <= ye.back())//盒子顶部合适
- {
- ye.push(he.top());
- he.pop();
- }
- else//盒子顶部不合适
- {
- if (he.top() > ye.back() && tui.empty())//盒子顶部叶子不合适且推送器空
- break;
- if (tui.front() <= ye.back())//推送器不大于叶子
- ye.push(tui.front());
- else
- he.push(tui.front());
- tui.pop();
- }
- }
- else//盒子为空
- {
- if (tui.empty()) break;//盒子和推送器皆空,结束
- if (tui.front() <= ye.back())
- ye.push(tui.front());
- else
- he.push(tui.front());
- tui.pop();
- }
- }
- }
- while (ye.size() > 1)
- {
- cout << ye.front() << " ";
- ye.pop();
- }
- cout << ye.front();
- cout << endl;
- if (tui.empty() && he.empty()) break;
- }
- }