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

被折叠的 条评论
为什么被折叠?



