PAT甲级真题-1014 Waiting in Line详解优化

本文介绍了一种通过结构体和队列实现的算法,用于模拟银行窗口服务过程。算法首先判断黄线内是否还有空位,然后每分钟遍历所有窗口,更新状态并删除已完成咨询的人。当所有服务完成后,程序会处理查询请求,输出客户完成咨询的时间。此方法将复杂问题分解为逻辑清晰的步骤,便于实现和理解。

1014 Waiting in Line

题目链接

https://pintia.cn/problem-sets/994805342720868352/problems/994805498207911936

解题思路

1.题目过了一遍,大概能想到用结构体+队列来实现;
2.我把整个业务逻辑分成两个部分考虑:

  • 判断黄线内是否还有空位,让人补齐(该过程不消耗时间);
  • 时间统一为分钟,每分钟遍历一遍所有窗口,并更新状态。有窗口完成咨询服务的话,就把人从队列中删除,并把黄线内人数-1;

总结

这种题目最好把整个过程切割成2到3个部分,分步进行实现。

代码展示

#include<bits/stdc++.h>
using namespace std;
/*
08:00 ~ 17:00
1.判断黄线内的人数
2.每一分钟查询一遍所有柜台,更新状态 
*/
int Cost[1005],CCost[1005];
queue<int>Wind[25];
int Time[1005];
int main(){
	int n,m,k,q;
	cin>>n>>m>>k>>q;
	//cout<<"A "<<n<<" "<<m<<endl;
	for(int i=1;i<=k;i++){
		cin>>Cost[i];
		CCost[i]=Cost[i];
	}
		
	int time=0,peo=1;int ye_peo=0;//黄线里的人数
	int num=k;
	while(k){
		int f=n*m;
		while(ye_peo<f && peo<=num){
		//	cout<<"塞人"<<endl;
			for(int i=1;i<=n;i++){
				if(ye_peo<f && peo<=num&&Wind[i].size()<m){
					Wind[i].push(peo);
					peo+=1;
					ye_peo+=1;
				}
			}
		} 
		time+=1;//printf("ye_peo = %d\tk = %d\tpeo = %d\n",ye_peo,k,peo);
		for(int i=1;i<=n;i++){
			if(Wind[i].size()){
				if((--Cost[Wind[i].front()])==0){
					k-=1;
					ye_peo-=1;
					Time[Wind[i].front()]=time;
					Wind[i].pop();
				}	
			}
		}
	}
	while(q--){
		int x;
		cin>>x;
		if(Time[x]-CCost[x]<540)
			printf("%02d:%02d\n",8+Time[x]/60,Time[x]%60);
		else printf("Sorry\n");
	}
	return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高冷小伙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值