【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”,而不是被服务完时间在五点以后(以题面为准)。
AAAAAccepted code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[1007]; 4 queue<pair<int,int> >qu[27]; 5 int ans[1007]; 6 int quy[1007]; 7 int sum[27]; 8 int main(){ 9 int n,m,k,q; 10 cin>>n>>m>>k>>q; 11 for(int i=1;i<=k;++i) 12 cin>>a[i]; 13 for(int i=1;i<=q;++i) 14 cin>>quy[i]; 15 for(int i=1;i<=m;++i) 16 for(int j=1;j<=n;++j) 17 if((i-1)*n+j<=k) 18 qu[j].push({a[(i-1)*n+j],(i-1)*n+j}); 19 int flag=m*n+1; 20 while(1){ 21 int mn=1e9; 22 for(int i=1;i<=n;++i) 23 if(!qu[i].empty()&&qu[i].front().first+sum[i]<mn) 24 mn=qu[i].front().first+sum[i]; 25 if(mn==1e9) 26 break; 27 for(int i=1;i<=n;++i) 28 if(!qu[i].empty()&&qu[i].front().first+sum[i]==mn){ 29 if(sum[i]>=540) 30 ans[qu[i].front().second]=-1; 31 else{ 32 sum[i]=mn; 33 ans[qu[i].front().second]=sum[i]; 34 } 35 qu[i].pop(); 36 if(flag<=k){ 37 qu[i].push({a[flag],flag}); 38 flag++; 39 } 40 } 41 } 42 for(int i=1;i<=q;++i){ 43 int hour=ans[quy[i]]/60+8; 44 int minute=ans[quy[i]]%60; 45 if(ans[quy[i]]==-1) 46 cout<<"Sorry"; 47 else{ 48 if(hour<10) 49 cout<<"0"<<hour<<":"; 50 else 51 cout<<hour<<":"; 52 if(minute<10) 53 cout<<"0"<<minute; 54 else 55 cout<<minute; 56 } 57 cout<<"\n"; 58 } 59 return 0; 60 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)