1014. Waiting in Line (30)

来源:互联网 发布:node gzip压缩 编辑:程序博客网 时间:2024/05/22 06:13

模拟的题。

代码如下:

#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 0x7FFFFFFFstruct 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;}


0 0
原创粉丝点击