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