1014. Waiting in Line (30)

模拟的题。

代码如下:

#include"stdio.h"
#include"string.h"
#include"math.h"
#include<iostream>
#include<vector>
#include<set>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
#define INF 0x7FFFFFFF

struct customer{
  int startTime;
  int processingTime;
  int leaveTime;
};
int n,m,k,q;

  vector<struct customer> customers;
  vector<int> queries;
  vector<queue<int>> bank;
int main(){
  
  scanf("%d %d %d %d",&n,&m,&k,&q);

  bank.resize(n);
  vector<int> baseTime(n,0);
  customers.resize(k);
  for(int i = 0;i < k;i++){
    int temp;
    scanf("%d",&temp);
    customers[i].processingTime = temp;
  }
  queries.resize(q);
  for(int i = 0;i < q;i++){
    int temp;
    scanf("%d",&temp);
    temp--;
    queries[i] = temp;
  }
  int p = 0;
  for(;p < m*n && p < k;p++){   //题目很明确的说,如果队列没满,就是很顺序的排序。 //漏了个p<k所以总是报短段错误。
    customers[p].leaveTime = baseTime[p%n]+customers[p].processingTime;
    baseTime[p%n] = customers[p].leaveTime;
    bank[p%n].push(p);
  }
  //队列外的人
  for(;p < k;p++){
    int mmin = INF;
    int index = -1;
    for(int i = 0;i < n;i++){
      int top = bank[i].front();      //本来自己写这里,老师想着直接用i%x(某一个x),然后来获得队首的值,有一个模拟队列,就漂亮多了。  
                            //注,这里是获得队尾元素。。理解错误。
      if(customers[top].leaveTime < mmin){
        mmin = customers[top].leaveTime;
        index = i;
      }
    }
    //pop and push
    customers[p].leaveTime = baseTime[index] + customers[p].processingTime;
    baseTime[index] = customers[p].leaveTime;
    bank[index].pop();
    bank[index].push(p);
  }
  for(int i = 0;i < q;i++){
    if(customers[queries[i]].leaveTime - customers[queries[i]].processingTime >= 540){  //之所以要见processingtime,
                                            //因为如果16:55来一个人,但17:05才走,是可以的
      printf("Sorry\n");  
    }else{
       printf("%02d:%02d\n", 8+customers[queries[i]].leaveTime/60, customers[queries[i]].leaveTime%60); 
    }
  }

  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值