pat甲级1014 Waiting in Line(C语言)

#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;
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值