#include<stdio.h>
struct Window{
int finishServiceTime=480;//这个窗口下次服务时间(其实就是这个客人结束时间)
int quene[1000];//这个窗口现在排队的人的序号,比如023,排了三个人,序号记得加一(或者...)后进前出
int front=0;
int rear=0;//现在窗口前排队的长度?人数
};
struct Window windows[20];//一共20个窗户
int main(){
int n,m,k,q;//窗口数20,线内窗口前排队人数10,客户数1000+1,询问自己啥时候能走的客户数1000,客户从1开始标号;
scanf("%d %d %d %d",&n,&m,&k,&q);
int processTime[1001],query[1000],finishTime[1001];//q个人在询问什么时候走
for(int i=1;i<k+1;i++)
scanf("%d",&processTime[i]);//i号客户的处理时间
for(int i=0;i<q;i++)
scanf("%d",&query[i]);
int customerIndex=1;//当前黄线外面排队的第一个客户的索引
//我需要先把所有窗口队列填满
for(int i=0;i<m&&customerIndex<k+1;i++){
for(int j=0;j<n&&customerIndex<k+1;j++){
windows[j].quene[windows[j].rear]=customerIndex;
windows[j].finishServiceTime=processTime[windows[j].quene[windows[j].front]]+480;
windows[j].rear++;
customerIndex++;
}
}
for(int i=0;i<n;i++){
if(windows[i].finishServiceTime!=480){
finishTime[windows[i].quene[windows[i].front]]=windows[i].finishServiceTime;
windows[i].front++;//队列前面少一个人
}
}
//我要找到结束时间最早的那个窗口,因为如果都没结束,最早的那个就是我下次排队的
while(customerIndex!=k+1){
int earliestWindowIndex=0;
for(int i=0;i<n;i++){
if(windows[i].finishServiceTime<windows[earliestWindowIndex].finishServiceTime){
earliestWindowIndex=i;
}
}
//把时间快进到窗口有位置
windows[earliestWindowIndex].quene[windows[earliestWindowIndex].rear]=customerIndex;//客户进入窗口队列
windows[earliestWindowIndex].rear++;
customerIndex++;
windows[earliestWindowIndex].finishServiceTime+=processTime[windows[earliestWindowIndex].quene[windows[earliestWindowIndex].front]];//结束时间顺延下去
finishTime[windows[earliestWindowIndex].quene[windows[earliestWindowIndex].front]]=windows[earliestWindowIndex].finishServiceTime;
windows[earliestWindowIndex].front++;//队列前面少一个人
}
//出循环,窗口排队
for(int i=0;i<n;i++){
while(windows[i].front!=windows[i].rear){
//beginTime[windows[i].quene[windows[i].front]]=windows[i].finishServiceTime;
windows[i].finishServiceTime+=processTime[windows[i].quene[windows[i].front]];//结束时间顺延下去
finishTime[windows[i].quene[windows[i].front]]=windows[i].finishServiceTime;
windows[i].front++;//队列前面少一个人
}
}
for(int i=0;i<q;i++){
if(finishTime[query[i]]-processTime[query[i]]>=1020){
printf("Sorry\n");
}else
printf("%02d:%02d\n",finishTime[query[i]]/60,finishTime[query[i]]%60);
}
return 0;
}
pat甲级1014 Waiting in Line(C语言)
最新推荐文章于 2024-08-09 17:45:43 发布