ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-07-20 14:34:29  阅读:175  来源: 互联网

标签:mini 测试点 int Waiting vt time 1014 顾客


易错点

测试点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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有