1014 Waiting in Line (30分)(一个字短!)

1014 Waiting in Line (30分)

分析

按照时间遍历,记录每位顾客的结束时间即可

代码

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n, m, k, q, a;
vector<int> f, service_time;
vector<vector<pair<int,int> > >w;//窗口,记录当前服务的顾客及其剩余服务时间
queue<pair<int,int> > que;//在排队而未进入窗口前排队的顾客
int main() {
 scanf("%d %d %d %d", &n, &m, &k, &q);
 f.resize(k + 1);
 service_time.resize(k + 1);
 for (int i = 1; i <= k; ++i) {
  scanf("%d", &a);
  service_time[i] = a;
  que.push(pair<int, int>(i, a));
 }
 w.resize(n);
 //按分钟记录服务过程,并记录每位顾客的结束时间
 for (int i = 0; i <= 540; ++i) {
 //对每一个非空的窗口前的顾客的剩余服务时间做-1操作,并将剩余服务时间为0的顾客从窗口前删除并保存期结束时间
  for (int j = 0; j < n; ++j) {
   if (!w[j].empty()) {
    w[j][0].second -= 1;
    if (w[j][0].second == 0) {
     f[w[j][0].first] = i;
     w[j].erase(w[j].begin());
    }
   }
  }
  //将正在排队等待的顾客放到序号最小且排队人数最少的窗口前的队列中
  while (true && !que.empty()) {
   int mc = m + 1, id;
   for (int j = 0; j < n; ++j)
    if (mc > w[j].size()) {
     mc = w[j].size();
     id = j;
    }
   if (mc == m)break;
   w[id].push_back(que.front());
   que.pop();
  }
 }
 //将下班后还在窗口前接受服务的顾客的结束时间计算并保存
 for (int i = 0; i < n; ++i)
  if (!w[i].empty()) {
   f[w[i][0].first] = 540 + w[i][0].second;
  }
 for (int i = 0; i < q; ++i) {
  scanf("%d", &a);
  if (f[a] == 0 || f[a] - 540 == service_time[a]) printf("Sorry\n");
  else
   printf("%02d:%02d\n", 8 + f[a] / 60, f[a] % 60);
 }
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值