每日一练——7-18 银行业务队列简单模拟(25 分)

330 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

题目描述:

设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。

输入格式:

输入为一行正整数,其中第1个数字N(≤1000)为顾客总数,后面跟着N位顾客的编号。编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口。数字间以空格分隔。

输出格式:

按业务处理完成的顺序输出顾客的编号。数字间以空格分隔,但最后一个编号后不能有多余的空格。

输入样例:

8 2 1 3 9 4 11 13 15

输出样例:

1 3 2 9 11 4 13 15

代码长度限制   16 KB

时间限制     400 ms

内存限制     64 MB

PS: 说实话,这题有一个点比较坑,先让大家看看测试点都有些啥吧: image.png 有一句话叫做不怕最大就怕最小,N最小不是0而是1
我先来给大家阐述一下思路吧~

思路分析:

  • 1.模拟两个队列,利用头文件<queue>,创建两个队列a和b
  • 2.这时,先要判断一下N的大小,如果是1的话,直接输出它(这就是坑人的测试点2)
  • 3.然后,考虑到格式化,我们先输出a的两个数
  • 4.进入到循环,当两个队列都未到达底端时,b先循环输出一个队头,a循环输出两个;
  • 注意: 如果循环过程中某个队列空了,应当跳出循环
  • 5.把a或b的余项输出

代码如下:

#include<iostream>
#include<queue>
using namespace std;

int main()
{
	int n;
	cin >> n;
	int x;
	//创建两个队列
	queue<int>a, b;
	for (int i = 0; i < n; i++) {
		cin >> x;
		//如果是奇数,则取a队列
		if (x % 2 != 0)
			a.push(x);
		else
			b.push(x);
	}
	if (n == 1) {
		cout << x;
	}
	else {
		x = a.front();
		cout << x;
		a.pop();
		x = a.front();
		cout << " " << x;
		a.pop();
		while (!a.empty() && !b.empty()) {
			for (int i = 0; i < 1 && !b.empty(); i++) {
				x = b.front();
				cout << " " << x;
				b.pop();
			}
			for (int i = 0; i < 2 && !b.empty(); i++) {
				x = a.front();
				cout << " " << x;
				a.pop();
			}
		}
		//将剩下的输出
		while (!a.empty()) {
			x = a.front();
			cout << " " << x;
			a.pop();
		}
		while (!b.empty()) {
			x = b.front();
			cout << " " << x;
			b.pop();
		}
	}
}

最后~

image.png 解题完成~