【PAT甲级】1014 Waiting in Line (30 分)(队列维护)

题面:

输入四个正整数N,M,K,Q(N<=20,M<=10,K,Q<=1000),N为银行窗口数量,M为黄线内最大人数,K为需要服务的人数,Q为查询次数。输入K个正整数,分别代表每位顾客需要被服务的时间,Q次查询每次查询一位顾客被服务完离开银行的时间。如果他在五点以前(不包括五点)没有开始被服务,输出“Sorry”。

trick:

在五点以前(不包括五点)没有开始被服务,输出“Sorry”,而不是被服务完时间在五点以后(以题面为准)。

代码:

#include<bits/stdc++.h>
using namespace std;
int a[1007];
queue<pair<int,int> >qu[27];
int ans[1007];
int quy[1007];
int sum[27];
int main(){
int n,m,k,q;
cin>>n>>m>>k>>q;
for(int i=1;i<=k;++i)
cin>>a[i];
for(int i=1;i<=q;++i)
cin>>quy[i];
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
if((i-1)*n+j<=k)
qu[j].push({a[(i-1)*n+j],(i-1)*n+j});
int flag=m*n+1;
while(1){
int mn=1e9;
for(int i=1;i<=n;++i)
if(!qu[i].empty()&&qu[i].front().first+sum[i]<mn)
mn=qu[i].front().first+sum[i];
if(mn==1e9)
break;
for(int i=1;i<=n;++i){
if(!qu[i].empty()&&qu[i].front().first+sum[i]==mn){
if(sum[i]>=540)
ans[qu[i].front().second]=-1;
else{
sum[i]=mn;
ans[qu[i].front().second]=sum[i];
}
//cout<<i<<" "<<qu[i].front().second<<" "<<sum[i]<<"\n";
qu[i].pop();
if(flag<=k){
qu[i].push({a[flag],flag});
flag++;
}
}
}
}
for(int i=1;i<=q;++i){
int hour=ans[quy[i]]/60+8;
int minute=ans[quy[i]]%60;
if(ans[quy[i]]==-1)
cout<<"Sorry";
else{
if(hour<10)
cout<<"0"<<hour<<":";
else
cout<<hour<<":";
if(minute<10)
cout<<"0"<<minute;
else
cout<<minute;
}
cout<<"\n";
}
return 0;
}

转载于:https://www.cnblogs.com/ldudxy/p/11250349.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值