这个系列是将自己在学校学习中遇到的比较好的例题以及其算法写下来。(对于大神来说肯定不算什么,但是对于编程刚入门的我来说还是有学到新东西的)
DS队列----银行简单模拟
题目描述
设某银行有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
#include<iostream>
#include<queue>
using namespace std;
int main() {
queue<int> q[2];
int t,data;
cin>>t;
while(t--){ //数据入队列,奇数进q[0],偶数进q[1]
cin>>data;
if(data%2)
q[0].push(data);
else
q[1].push(data);
}
int i=0;
if(q[0].empty()) //输出的第一个数据格式和其他不同,单独处理
i=1;
cout<<q[i].front();
q[i].pop();
i=1;
while(!q[0].empty()|| !q[1].empty()){
i++;
if(!q[0].empty()){ //每隔一次输出一个数据
cout<<"
"<<q[0].front();
q[0].pop();
}
if(!q[1].empty() && i%2==0){ //每隔两次输出一个数据
cout<<" "<<q[1].front();
q[1].pop();
}
}
return 1;
}
答案解析:
首先先将所有数据放进两个队列中
然后第一个或者最后一个输出格式特别,这里选择了在第一个输出做修改。
首先是判断A队列是否有人,如果非空就输出A这里巧妙的使用i作为判断依据,如果非空则修改i的数据。
接下来也就是最妙的地方在于:
因为A窗口处理速度快,B窗口处理速度慢,A处理两个B处理一个,并且同时的话优先输出A(采用在循环中将输出A的语句放在输出B的语句之前)。但是要搞个附带的时间流动的程序又麻烦,于是我们巧妙的使用了i,每次循环过后让i++,并且当i加两次的时候输出B,而A每次都会循环。