1014. Waiting in Line (30)

本文介绍了一种使用队列解决银行客户排队问题的方法。通过建立多个队列来模拟银行窗口的服务流程,并实现了客户服务时间的计算。文章详细展示了如何初始化队列、处理客户请求以及输出结果。

前两天感觉还没思路来着

今天做了1017题,感觉差不多,有点思路

第一次用队列。。。

刚开始想建立n个队列,天真的这么写。。。

vector< queue<int> > wait;
后来看到这边https://segmentfault.com/q/1010000007253685

试了一下,直接就这样写就行

queue<int> wait[n];

之前代码中就是下面这样扒拉扒拉一通写,所幸误打误撞不用改
wait[j].pop();
代码如下:

#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
struct cust{
	int need;//需要服务的时间
	int start;//开始服务的时间
	int end;//结束服务的时间 
};
int open=8*60;//开门时间
int close=17*60;//关门时间 
vector<cust> a;
//queue<int> wait;//每个窗口设置一个长度为M的等待队列 
vector<int> win;//记录窗口的当前时间
vector<int> check;
 int main(){
 	//input
 	int n,m,k,q;
 	scanf("%d%d%d%d",&n,&m,&k,&q);
 	queue<int> wait[n];
 	for(int i=0;i<k;i++){
 		//scanf("%d",&a[i].need);
 		cust c;
 		cin>>c.need;
 		a.push_back(c);
	 }
	 //int check[q];
	for(int i=0;i<q;i++){
	 	//scanf("%d",&check[i]);
	 	int b;
	 	cin>>b;
	 	check.push_back(b-1);
	 }
	for(int i=0;i<n;i++) win.push_back(open);//窗口值初始化为八点 
	if(n*m>=k){//等待人数都在黄线内 
		for(int i=0;i<k;i++){
			a[i].start=win[i%n];
			win[i%n]+=a[i].need;
			a[i].end=win[i%n];
		}
		
	}
	else{
		for(int i=0;i<m*n;i++){//前m*n个客户先在n个窗口前黄线排好队 
			wait[i%n].push(i);
		}
		for(int j=0;j<n;j++){//服务第一个客户 
			a[wait[j].front()].start=win[j];
			win[j]+=a[wait[j].front()].need;
			a[wait[j].front()].end=win[j];
			wait[j].pop();
		}
		int pos;
		for(int i=m*n;i<k;i++){//黄线外的客户全部进入黄线 
			//找窗口值最小的下标 
			pos=distance(win.begin(),min_element(win.begin(),win.end()));
			a[wait[pos].front()].start=win[pos];
			win[pos]+=a[wait[pos].front()].need;
			a[wait[pos].front()].end=win[pos];
			wait[pos].pop();
			wait[pos].push(i); 
		}
		//服务在黄线内的剩余客户 
		for(int j=0;j<n;j++){
			while(!wait[j].empty()){
				a[wait[j].front()].start=win[j];
			    win[j]+=a[wait[j].front()].need;
			    a[wait[j].front()].end=win[j];
			    wait[j].pop();
			}
		}	
	}
	//output
	for(int i=0;i<q;i++){
			if(a[check[i]].start>=close){
				printf("Sorry\n");
			}
			else{
				printf("%02d:%02d\n",a[check[i]].end/60,a[check[i]].end%60);
			}
		} 
 } 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值