PAT这道题是一道模拟题
我的代码最后一个例子没过,若有大神发现bug,请联系我
https://www.patest.cn/contests/pat-a-practise/1014
其实逻辑正确,并且注意到几个陷进就能把这道题做出来。
下面说说我在做这道题时遇到的陷阱
1.输出Sorry的时候一定要输出换行符
2.17:00前开始服务的客户,就算到了17:00也可以一直到服务结束银行才关门
下面是我的代码
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int n,m,k,q;
struct Node{
int process;
int ti;
int over;
int inde;//标记自己在数组中的下标
};
const int maxn=1010;
Node ti[maxn];
int query[maxn]={0};
queue<Node> windows[21];
int main(){
scanf("%d%d%d%d",&n,&m,&k,&q);
for(int i=0;i<k;i++){
scanf("%d",&ti[i].ti);
ti[i].process=ti[i].ti;
ti[i].inde=i;
}
for(int i=0;i<q;i++){
scanf("%d",&query[i]);
}
int total_m=0;
int index=0;//指示黄线外的人
//到窗口排队
for(int j=0;j<m;j++){
for(int i=0;i<n;i++){
if(index>=k) break;//如果m*n都没有K大
windows[i].push(ti[index++]);
}
}
while(1){
//银行开始提供服务,最难处理的是在17:00前被处理的用户,若17:00还没结束,那么还要继续处理
total_m++;//这个表示本次循环结束的时间
bool flag=true;//表示是否每个窗口都为空
for(int i=0;i<m;i++){//m个窗口同时在处理
if(windows[i].empty());
else{
flag=false;//表示窗口还有人
windows[i].front().process--;
if(windows[i].front().process==0){
ti[windows[i].front().inde].over=total_m;
windows[i].pop();
if(index<k){
windows[i].push(ti[index]);
index++;
}
}
}
}
if(total_m==540)//一轮结束刚好到17:00
{
//在17:00的时候检查每个窗口,如果有正在执行操作的用户,那么可以直接告诉结束时间。
//判断该窗口的用户是否已经开始操作的标识是procee小于ti
for(int i=0;i<m;i++){
if(windows[i].empty());
else{
if(windows[i].front().process<windows[i].front().ti){
ti[windows[i].front().inde].over=total_m+windows[i].front().process;
}
}
}
break;
}
if(flag==true) break;
}
for(int i=0;i<q;i++){
if(ti[query[i]-1].over==0) {
printf("Sorry\n");
continue;
}
int hh=ti[query[i]-1].over/60+8;
int mm=ti[query[i]-1].over%60;
printf("%02d:%02d\n",hh,mm);
}
return 0;
}