PTA甲级1014 快乐模拟 Waiting in Line

PTA甲级1014 快乐模拟 Waiting in Line

题目
在这里插入图片描述

大意:有N个窗口,每个窗口的黄线前可以排最多M个人。客户到银行时优先排在人数少的窗口前面,如果有多个窗口人数一样就排在序号小的窗口前。在下午5点前还没有开始服务的客户无法完成业务。求询问的客户完成业务的时间(无法完成输出sorry)。

代码:

#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
const int maxnode = 1111;
int n,m,k,query,q;
int convermin(int h,int m){
    return h*60+m;//将时间转化为分钟
}
struct window{
    int endtime,poptime;
    queue<int> q;//队列
}window[20];
int ans[maxnode],need[maxnode];//服务结束时间和服务需要时间
int main(){
    int inIndex=0;//当前第一个为入队的编号
    scanf("%d%d%d%d",&n,&m,&k,&query);
    for(int i = 0;i < k;i++){
        scanf("%d",&need[i]);
    }
    for(int i = 0;i < n;i++){//初始化每个窗口开始时间
        window[i].poptime = window[i].endtime = convermin(8,0);
    }
    for(int i = 0;i < min(n*m,k);i++){
        window[inIndex%n].q.push(inIndex);//更新窗口服务时间
        window[inIndex%n].endtime += need[inIndex];
        if(inIndex < n) window[inIndex].poptime = need[inIndex];//对窗口的第一个客户,更新poptime
        ans[inIndex] = window[inIndex % n].endtime;
        inIndex++;
        }
    for(;inIndex < k;inIndex++){//处理剩余客户入队
        int idx = -1,minpoptime = 1<<30;//寻找所有窗口最小poptime
        for(int i = 0;i < n;i++){
            if(window[i].poptime < minpoptime){
                idx = i;
                minpoptime = window[i].poptime;
            }
        }
        window[idx].q.pop();
        window[idx].q.push(inIndex);
        window[idx].endtime += need[inIndex];//更新该窗口队列的endtime
        window[idx].poptime += need[window[idx].q.front()];//更新窗口的poptime
        ans[inIndex] = window[idx].endtime;
    }
    for(int i = 0;i < query;i++){
        scanf("%d",&q);//查询客户编号
        if(ans[q-1]-need[q-1]>=convermin(17,0)){
            printf("Sorry\n");
        }else{
            printf("%02d:%02d\n",ans[q-1]/60,ans[q-1]%60);
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值