PAT 甲级1014 Waiting in line 模拟队列

在这里插入图片描述在这里插入图片描述

代码如下:

#include <iostream>
#include <stdio.h>
#include <queue>
#define seventeen 1020
#define eight 480

#define	INF 0x3f3f3f3f
using namespace std;

struct customer{
	int cost_time;//所需服务时间
	int s_time;//开始服务时间
	int f_time;//结束服务时间
}cus[1005];

struct window{
	int f_time;//窗口黄线以内最后一个客户的服务接受时间
	           //也就是窗口的当前时间
	queue<int> q;//在窗口排队的客户队列,包含黄线以外的客户
	window(){//初始化时间
        f_time=eight;
    }
}win[20];

int main(){
	int n,m,k,q;//n为有n个窗口,m为每个窗口的最大容量,k为有k个人,
	            //q为要查询的人数
	cin>>n>>m>>k>>q;
	for(int i=1;i<=k;i++){
		cin>>cus[i].cost_time;
	}
	//把前n*m个客户插入黄线以内
	for(int i=1,j=0;i<=n*m&&i<=k;i++){
        cus[i].s_time=win[j].f_time;//每个客户开始服务的时间
		cus[i].f_time=win[j].f_time+cus[i].cost_time;//每个客户完成的时间
		win[j].f_time+=cus[i].cost_time;//更新窗口的当前时间
		win[j].q.push(i);
		j=(j+1)%n;
	}
	//把剩下的客户插入到该进的窗口队列
	for(int i=n*m+1;i<=k;i++){
        int min_time=INF;
        int top;//队首元素
        int pos;//记录最早完成的窗口编号
		for(int j=0;j<n;j++){//遍历所有窗口,找到最先结束服务的客户所在的窗口
			top=win[j].q.front();
			if(cus[top].f_time<min_time){
				min_time=cus[top].f_time;
				pos=j;
			}
		}
		cus[i].s_time=win[pos].f_time;//客户接受服务的时间
		cus[i].f_time=win[pos].f_time+cus[i].cost_time;//客户完成服务的时间
		win[pos].f_time+=cus[i].cost_time;//更新窗口的当前时间
		win[pos].q.push(i);//将第一个客户取出
		win[pos].q.pop();//把黄线以外的客户入队列
	}
	int hour,minute,num;//num为客户编号
	for(int i=0;i<q;i++){
		cin>>num;
		if(cus[num].s_time>=seventeen){//若客户开始服务的时间大于等于5点
		                              //则不能为其服务
			cout<<"Sorry";
			if(i!=q-1){
                cout<<endl;
			}
		}else{
			hour=(cus[num].f_time)/60;//计算小时
			minute=(cus[num].f_time)%60;//计算分钟
            printf("%02d",hour);
            cout<<':';
            printf("%02d",minute);
            if(i!=q-1){
                cout<<endl;
            }
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44123362/article/details/89450358