1014 Waiting in Line (测试点1、4、5的解法)

这一题做的时候遇到几个坑点

对应测试点1: 这个是我错了很久的,一直提示段错误,当然后来发现是我自己编程习惯不好。即如果窗口数大于总人数,那有些窗口在一开始就没有人来办理业务,所以如果直接对每个窗口正在办理业务的客户之间-1的话,就会出现段错误
例:窗口数20,总人数 1人,那2-20号窗口一开始就没有客户,所以在clock++进行计时的时候,窗口1的客户时间需要-1,而2-20号窗口没有客户,所以不可以-1

对应测试点4、5: 即只要在17:00之前进入窗口进行业务办理,但还未办理完成的,不管多久,都会到办理完成为止
例:一个人16:49分进入1号窗口办理业务,要办理120分钟,则他的完成时间为18:49

[AC代码]

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;

struct node{
    int num,t,endt=-1;
};
int n,m,k,Q,u,now;
node p[1005];
vector<node> q[25];
vector<node>::iterator it;
void trans(int t){                                       //时间格式的转换
    if(t==-1) cout<<"Sorry"<<endl;
    else      printf("%02d:%02d\n",8+t/60,t%60);
}
bool is_Empty(){                                         //判断当前n个窗口是否还有客户(用于17:00之后)
    for(int j=1;j<=n;j++){
        it=q[j].begin();
        if(it!=q[j].end()&&it->t>0)   return false;
    }
    return  true;
}
int main()
{
    cin>>n>>m>>k>>Q;

    for(int i=1;i<=k;i++)  p[i].num=i,cin>>p[i].t;
    for(int i=1;i<=n*m&&i<=k;i++){
        int minl=1000;                                    //要每次都对minl初始化,不然后面的数据就无法输入了
        for(int j=1;j<=n;j++)
            if(q[j].size()<minl) minl=q[j].size(),u=j;
        q[u].push_back(p[i]);
    }
    int clock=0;
    now=n*m+1;
    while(clock<539){                                     //8:00-16:59 的客户办理情况
        clock++;
        for(int j=1;j<=n;j++){                                     //分钟每次+1,便对n个窗口正在办理业务的客户时间-1
            it=q[j].begin();
            if(it!=q[j].end()){                                    //这里一定要判断一下窗口是否为空,因为可能窗口数大于总人数,所以有些窗口一开始就没有人
                it->t--;
                if(it->t==0){                                      //如果当前客户时间减为0
                   p[it->num].endt=clock;                          //①则记录下该客户的离开时间
                   q[j].erase(it);                                 //②并让该客户离开窗口
                   if(now<=k)  q[j].push_back(p[now]),now++;       //③下一位等待的客户进入黄线内队列
                }
            }
        }
    }
    while(!is_Empty()){                                   //17:00之前已经在窗口办理业务,但尚未完成的客户
        clock++;             
        for(int j=1;j<=n;j++){
            it=q[j].begin();
            if(it!=q[j].end()){
                it->t--;
                if(it->t==0){                                       //如果当前客户时间减为0
                   p[it->num].endt=clock;                           //①则记录下该客户的离开时间
                }
            }
        }
    }
    int query;
    for(int i=0;i<Q;i++){
        cin>>query;
        trans(p[query].endt);
    }
    return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值