1014 Waiting in Line (30 分)

解题思路

  • 先让 n × m n\times m n×m个数进入分界线内,但要判断一下人数,有 k < n × m k<n\times m k<n×m k > = n × m k>=n\times m k>=n×m 两种情况
  • 结构体存入三个数据:
    1. 队首出队时间
    2. 最后结束时间
    3. 一个队列
  • 这样处理的话,后面就可以通过遍历找到每个窗口的队首处理时间,找到最小值,一个一个插入到对应的窗口中。
  • 注意如果在17:00之前还没进入排队,就say Sorry。但是你处理完时间超过17:00还是OK的

code

#include <bits/stdc++.h>
using namespace std;
struct node{
    int fir=8*60,end=8*60;
    queue<int> q;
};
int main(){
    int n,m,k,q,x,index=1;
    cin>>n>>m>>k>>q;
    node win[n+1];
    vector<int> judge(k+1,0),ans(k+1,0);
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++){
            if(index<=k){
                cin>>x;
                win[j].q.push(x);
                if(win[j].end>=17*60) judge[index]=1;
                win[j].end+=x;
                if(i==1) win[j].fir=win[j].end;
                ans[index++]=win[j].end;
            }
        }
    while(index<=k){
        cin>>x;
        int minw=1,mint=win[1].fir;
        for(int i=2;i<=n;i++)
            if(win[i].fir<mint){
                mint=win[i].fir;
                minw=i;
            }
        win[minw].q.pop();
        win[minw].q.push(x);
        if(win[minw].end>=17*60) judge[index]=1;
        win[minw].end+=x;
        win[minw].fir+=win[minw].q.front();
        ans[index++]=win[minw].end;
    }
    for(int i=1;i<=q;i++){
        cin>>x;
        judge[x]?printf("Sorry\n"):printf("%02d:%02d\n",ans[x]/60,ans[x]%60);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值