PAT (Advanced Level) Practice 1014 Waiting in Line C语言

在这里插入图片描述
又是花了好久的题…还是因为题目看太快和没有想充分就开始(最开始的时候Sorry的s忘记大写…弄得我怀疑人生)。
一开始没有get到他说的17点前开始的业务在17点后完成也依然不会输出sorry,以为17点银行就全部关门了,其实不是。好几个测试点都是考察了在17点后结束的情况。
修改过后最后一个点还是过不去很奇怪,但是根据之前几次类似的经历,修改了一下一个数组的大小就解决了,最后成功通过。
最后润色了一下,开始的时候把小时和分钟分开记录,多用了很多数组和很多行代码,特别冗杂,感觉自己挺傻的,现在改成了统一记录分钟(怪我没想充分就开始),虽然最后代码还是不够简洁,依然有一些重复部分,但应该还是比较易懂的。

#include<stdio.h>

int fastest(int WtimeH[20], int n);
int main(){
	
	int n,m,k,q;
	scanf("%d %d %d %d",&n,&m,&k,&q);
	
	int i,w=0,hh,mm,pp=0,flag=1;					//pp为正在排队的人 
	int Ptime[1000],Wtime[20]={0},time[1000]={0};		//每个人处理时间,窗口时间,每个人结束时间 
	int FWtime[20]={0};			//窗口第一个结束时间 
	int Stime[1000]={0};			//开始时间 
	
	struct{
		int qq[11];
	}queue[20];
	
	int front[20],rear[20];
	
	for(i=0; i<k; i++){
		scanf("%d",&Ptime[i]);
	}
	
	for(pp=0; pp<n*m; pp++){				//先处理前n*m个 
		if(w>=n){
			w=0;flag=0;
		}
		queue[w].qq[rear[w]]=pp;				//记录队列中人的序号 
		rear[w]++;
		Stime[pp]=Wtime[w];
	
		Wtime[w]+=Ptime[pp];
		if(flag){
			FWtime[w]+=Ptime[pp];
		}		
		time[pp]=Wtime[w];
		w++;
	}w=0;
	
	while(pp<k){
		w=fastest(FWtime, n);			//最快的窗口 
		front[w]++;front[w]%=m;
		FWtime[w]+=Ptime[queue[w].qq[front[w]]];
		queue[w].qq[rear[w]]=pp;
		rear[w]++;rear[w]%=m;	
		Stime[pp]=Wtime[w];
		Wtime[w]+=Ptime[pp];
		time[pp]=Wtime[w];
		pp++;
	}
	
	for(i=0; i<q; i++){
		scanf("%d",&pp);
		pp-=1;
		if(Stime[pp]>=540){
			printf("Sorry\n");
		}else{
			printf("%02d:%02d\n",8+(time[pp]/60),time[pp]%60);
		}
	}

	return 0;
}

int fastest(int FWtime[20], int n){
	int i;
	int t=999999;
	int min;
	for(i=0; i<n; i++){
		if(FWtime[i]<t){
			t=FWtime[i];
			min=i;
		}
	}
	return min;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值