其他分享
首页 > 其他分享> > 1014 Waiting in Line 测试点2、4、5数据 注释附思路

1014 Waiting in Line 测试点2、4、5数据 注释附思路

作者:互联网

易错点

测试点2、4、5:如果有一个人开始服务时间在5点之前(不包括5点),结束服务时间在5点之后,那么需要服务这个人

测试点数据样例:

2 1 3 3
1 540 540
1 2 3

输出:

08:01
17:00
17:01

代码

#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
int cus[1001];//记录每个顾客需要花费的时间 
int cus2[1001];//记录每个顾客结束服务的时间 
int cus3[1001];//cus[]的copy,用于修改 
string to_time(int a){//将整数a分钟转化为字符串具体的某时某分 
	int hour;
	int minute;
	string time;
	string str_hour;
	string str_min;
	hour=a/60+8;
	minute=a%60;
	if(hour<10){
		str_hour="0";
		str_hour+=('0'+hour);
	}
	else{
		str_hour="";
		str_hour+=('0'+hour/10);
		str_hour+=('0'+hour%10);
	}
	if(minute<10){
		str_min="0";
		str_min+=('0'+minute);
	}
	else{
		str_min="";
		str_min+=('0'+minute/10);
		str_min+=('0'+minute%10);
	}
	time=str_hour+':'+str_min;
	return time;
}
int main()
{
	for(int i=0;i<1001;i++){
		cus2[i]=0;
	}
	int n,m,k,q;
	int time;
	int query;
	queue<int> q1;//放各个窗口排队的顾客序号 ,计算过程中会有顾客出队 
	queue<int> q2;//放各个窗口排队的顾客序号 ,计算过程中没有顾客出队 
	vector<queue<int> > vt;
	vector<queue<int> > vt2; 
	int f;//判断当前个窗口(队列)是否有没排满的 
	int fi;//记录没满队列的序号; 
	int min;//各个排队队列的队首顾客花费时间的最小值 
	int mini;//记录花费时间最小值的顾客序号 
	int cnt;//每个窗口等待的累计时间 
	cin>>n>>m>>k>>q;
	for(int i=0;i<n;i++){
		vt.push_back(q1);
		vt2.push_back(q2);
	}
	for(int i=1;i<=k;i++){
		cin>>time; 
		cus[i]=time;
		cus3[i]=time; 
		if(i<=n*m){//直接可以依次放队列里 
			vt[(i-1)%n].push(i); //在队列中存放的是顾客的序号 
			vt2[(i-1)%n].push(i);
		}
		else{
			//遍历每一个队列的队首元素的花费时间,找出最小值
			//最小值的那个元素出队
			//其他队列的队首元素需要减去这个最小值
			//如果有等于0的也要一起出列
			//后续进队的元素先判断有没有不满的队列,再进入当前序号最小的不满队列
			f=0;
			for(int j=0;j<vt.size();j++){
				if(vt[j].size()<m){
					f=1;
					fi=j; 
					break;
				}
			} 
			if(f==1){//有空缺,直接进入这个队列 
				vt[fi].push(i); 
				vt2[fi].push(i);
			} 
			else if(f==0){//没有空缺 
				min=9999999;
				for(int j=0;j<vt.size();j++){//找出花费时间最少的队首顾客 
					if(min>cus3[vt[j].front()]){
						min=cus3[vt[j].front()];
						mini=j;
					}
				} 
				vt[mini].pop();//最小值出列
				vt[mini].push(i);
				vt2[mini].push(i);
				for(int j=0;j<vt.size();j++){
					if(j!=mini){//其他队列减去这个最小值 
						cus3[(vt[j].front())]-=min; 
					}
					if(cus3[(vt[j].front())]==0){//如果减完等于0,也出列 
						vt[j].pop(); 
					}
				} 
			}
		}
	}
	//执行到这一步,vt2存放的是,这一天中每个窗口的所有顾客的排序 
	//下一步,计算每个顾客需要等待的时间 
	//遍历每个队列,对每个队列,为每个顾客计算开始服务的时间
	for(int i=0;i<vt2.size();i++){
		cnt=0; 
		while(vt2[i].empty()==0){
			cnt+=cus[(vt2[i].front())];
			cus2[(vt2[i].front())]=cnt;// 
			vt2[i].pop();
		}
	} 
	//这一步已可以通过cus2[]查询到每个顾客的结束时间,但是是以分为单位 
	for(int i=0;i<q;i++){
		cin>>query;
		if((cus2[query]-cus[query])<540&&query>1){
			cout<<to_time(cus2[query])<<endl;
		}	
		else if(query==1){
			cout<<to_time(cus2[query])<<endl;
		}
		else{
			cout<<"Sorry"<<endl;
		}
	}
	return 0;
}

参考

(27条消息) PAT甲级真题 1014 Waiting in Line (30分) C++实现(题意有坑,测试点2、4、5会报错)_zhang35的博客-CSDN博客

标签:mini,测试点,int,Waiting,vt,time,1014,顾客
来源: https://www.cnblogs.com/wodeblog1982/p/16497823.html