PAT甲级1014——Waiting in Line

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int Open_time=8*60;
const int Close_time=17*60;
int main(){
	int N,M,K,Q;
	scanf("%d%d%d%d",&N,&M,&K,&Q);
	int needT[1000];
	for(int i=0;i<K;++i)
		scanf("%d",&needT[i]);
	int availT[20];
	fill(availT,availT+N,Open_time);
	queue<int> inYellow[20],outYellow;
	int inYellowNum=min(N*M,K);
	for(int i=0;i<inYellowNum;++i)
		inYellow[i%N].push(i);
	for(int i=inYellowNum;i<K;++i)
		outYellow.push(i);
	int cnt=0;
	int getdone[1005]={0};
	while(cnt<K){
		int win_idx=0;
		int Min=1e8;
		//找到当前最早结束业务的窗口;
		for(int i=0;i<N;++i){
			if(inYellow[i].empty()) continue;
			int cus=inYellow[i].front();
			if(availT[i]+needT[cus]<Min){
				Min=availT[i]+needT[cus];
				win_idx=i;
			}
		}
		//if(availT[win_idx]>=Close_time) break;  
		int cus_idx=inYellow[win_idx].front();
		inYellow[win_idx].pop();
		if(!outYellow.empty()){
			inYellow[win_idx].push(outYellow.front());
			outYellow.pop();
		}
		int finishT=availT[win_idx]+needT[cus_idx];
		getdone[cus_idx]=finishT;
		availT[win_idx]=finishT;
		++cnt;
	}
	for(int i=0;i<Q;++i){
		int qry;
		scanf("%d",&qry);
		if(getdone[qry-1]-needT[qry-1]>=Close_time) printf("Sorry\n");
		else printf("%02d:%02d\n",getdone[qry-1]/60,getdone[qry-1]%60);
	}
	system("pause");
	return 0;
}

第一遍写的时候不明白为什么在模拟过程中"所有窗口中最早结束手头业务的窗口(availT[win]+needT[cus]最小),其availT,也就是当前业务开始的时间大于等于关门时间退出"的做法有什么问题,为什么测试点4不过,后来明白了,虽然availT[win]+needT[cus]最小,但是不代表availT[win]就是最小的,也就是说,可能其它窗口业务开始时间更早,客户在关门时间前已经得到服务,所以要输出时间。
后来就改为计算所有客户的业务结束时间,然后减去业务用时,得到开始时间,在关门前的输出时间,反之Sorry###

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值