题目
分析
题目的大意就是模拟银行排队办理业务的场景。
有几个注意点
- 用户在17点前已经在办理业务了,就算已经到17点也继续办下去
- 客户每次都是选择最短的队列 之前选择了从0开始第一个队列 总有一个点过不去
封装了一些方法 代码搞得很冗长了。。
Code
#include <stdio.h>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct Customer{
int remainTime;
int no;
int finishTime;
int alltime;
}cus[1001];
// 获得时间
void getTime(int delay){
int hour = (delay+480)/60;
int min = (delay+480)%60;
printf("%02d:%02d\n", hour, min);
};
int n,m,k,q;
vector<queue<Customer> > ql;
// 判断队伍是否满了
bool isfullq(){
for (int i = 0; i < n; i++)
{
if(ql[i].empty()||ql[i].size()<m){
return false;
}
}
return true;
}
bool isEmptyQ(){
for (int i = 0; i < n; i++)
{
if(!ql[i].empty()){
return false;
}
}
return true;
}
int main(){
cin>>n>>m>>k>>q;
queue<Customer> user;
for (int i = 1; i <=k; i++)
{
int qtime;
cin>>qtime;
cus[i].no=i;
cus[i].remainTime = qtime;
cus[i].finishTime = -1;
cus[i].alltime = qtime;
user.push(cus[i]);
}
for (int i = 0; i < n; i++)
{
queue<Customer> tmp;
ql.push_back(tmp);
}
for (int i = 1; i <= 540; i++){
if(user.empty()&&isEmptyQ()) break;
// 首先填满所有队列
while (!isfullq()&&!user.empty()){
// 每次选择队伍最少的加入
int pushindex = 10000000;
int maxq = m+10;
for (int j = n-1; j >=0; j--)
{
queue<Customer> qi = ql[j];
if(qi.empty()||qi.size()<=maxq){
maxq=qi.size();
pushindex =j;
}
}
ql[pushindex].push(user.front());
user.pop();
}
// 对所有队列的第一人剩余时间减1
for (int j = 0; j < n; j++)
{
queue<Customer> qi = ql[j];
if(!qi.empty()){
qi.front().remainTime--;
if(qi.front().remainTime==0){
// 办理完业务弹出
cus[qi.front().no].finishTime = i;
qi.pop();
}
ql[j]=qi;
}
}
}
// 看下下班后有没有没办完要加班的
for (auto qi : ql){
//queue<Customer> qi = ql[j];
while(!qi.empty()){
if(qi.front().remainTime!=qi.front().alltime){
// 没开始办理业务的 直接弹出
// 办理了的看下什么时候办理结束
cus[qi.front().no].finishTime = 540+qi.front().remainTime;
}
qi.pop();
}
}
for (int i = 0; i < q; i++)
{
int checkno;
cin>>checkno;
if(cus[checkno].finishTime==-1){
cout<<"Sorry"<<endl;
}else{
getTime(cus[checkno].finishTime);
}
}
}