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

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

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

3-3 银行业务队列简单模拟 (25 分)_i++


3-3 银行业务队列简单模拟 (25 分)_c++_02


题目思路,考虑到实际的数据不可能都是两个A一个B搭配,A和B都有可能缺人。题目有点归并排序的味道。

#include<iostream>

using namespace std;

int main()
{
int n, ar[1000], que1[1000], que2[1000], k1 = 0, k2 = 0, br[1000], k = 0;
int c1 = 0, c2 = 0;
int flag = 0;
cin >> n;

for (int i = 0; i < n; i++)
{
cin >> ar[i];
if (ar[i] % 2 == 0)
que2[k2++] = ar[i];
else
que1[k1++] = ar[i];
}
//上述操作是将A和B两个柜台的客户按顺序都排好队。

for (int i = 1; i <= n; i++)
{
if (c1 < k1 && c2 < k2)
{
flag++; //这个flag是个标记,标志着什么时候出A什么时候出B
if (flag % 3 != 0)
br[k++] = que1[c1++];
else
br[k++] = que2[c2++];
}
else
break; //当有一个窗口的客人全部办好业务以后,只考虑另一个窗口即可
}

while (c1 != k1) //如果A窗口还有人,B窗口没人
br[k++] = que1[c1++];
while (c2 != k2) //如果B窗口还有人,A窗口没人
br[k++] = que2[c2++];

if (k)
{
for (int i = 0; i < k; i++)
{
if (i) cout << " ";
cout << br[i];
}
}
else
cout << 0;
return 0;
}