其他分享
首页 > 其他分享> > 1014 Waiting in Line (30 分)

1014 Waiting in Line (30 分)

作者:互联网

Suppose a bank has N windows open for service. There is a yellow line in front of the windows which devides the waiting area into two parts. The rules for the customers to wait in line are:

Now given the processing time of each customer, you are supposed to tell the exact time at which a customer has his/her business done.

For example, suppose that a bank has 2 windows and each window may have 2 customers waiting inside the yellow line. There are 5 customers waiting with transactions taking 1, 2, 6, 4 and 3 minutes, respectively. At 08:00 in the morning, customer1​ is served at window1​ while customer2​ is served at window2​. Customer3​ will wait in front of window1​ and customer4​ will wait in front of window2​. Customer5​ will wait behind the yellow line.

At 08:01, customer1​ is done and customer5​ enters the line in front of window1​ since that line seems shorter now. Customer2​ will leave at 08:02, customer4​ at 08:06, customer3​ at 08:07, and finally customer5​ at 08:10.

Input Specification:

Each input file contains one test case. Each case starts with a line containing 4 positive integers: N (≤20, number of windows), M (≤10, the maximum capacity of each line inside the yellow line), K (≤1000, number of customers), and Q (≤1000, number of customer queries).

The next line contains K positive integers, which are the processing time of the K customers.

The last line contains Q positive integers, which represent the customers who are asking about the time they can have their transactions done. The customers are numbered from 1 to K.

Output Specification:

For each of the Q customers, print in one line the time at which his/her transaction is finished, in the format HH:MM where HH is in [08, 17] and MM is in [00, 59]. Note that since the bank is closed everyday after 17:00, for those customers who cannot be served before 17:00, you must output Sorry instead.

Sample Input:

2 2 7 5
1 2 6 4 3 534 2
3 4 5 6 7

Sample Output:

08:07
08:06
08:10
17:00
Sorry

Submit01:

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define maxK 1001//最多有1001个人
#define maxN 20//n最大20个窗口
#define maxM 10//m黄线前最多可以排10个人
struct Window{
    queue<int> q;//总人数队列
    int popTime;//每个人所需服务时间
}windows[maxN];
int cost[maxK];
int finished[maxK];
int n,m,k,q;
//每个窗口黄线位置填充
int fillWindow() {
    int id = 1;
    for (int j=0;j<n;j++) {
        windows[j].popTime = cost[id];
        windows[j].q.push(id);
        if(++id > k) return id;
    }
    for (int i=0;i<m-1;i++) {
        for (int j=0;j<n;j++) {
            windows[j].q.push(id);
            if(++id > k) return id;
        }
    }
    return id;
}
int main() {
    scanf("%d %d %d %d",&n,&m,&k,&q);
    for (int i=1;i<=k;i++) {
        scanf("%d",&cost[i]);
    }
    fill(finished,finished+maxK,-1);//初始化完成时间,-1表示无法完成任务
    int id= fillWindow();
    for (int t=0;t<540;t++) {
        for (int i=0;i<n;i++) {
            if (windows[i].popTime != t) continue;
            finished[windows[i].q.front()] = t;//记录完成时间
            windows[i].q.pop();//出列
            if(windows[i].q.size() > 0) {
                windows[i].popTime = t + cost[windows[i].q.front()];//更新出列时间
            }
            if (id > k) continue;//
            windows[i].q.push(id++);//出列一个黄线外客户进入一个
        }
    }
    for (int i=0; i<n;i++) {
        if(windows[i].q.size() < 1) continue;
        finished[windows[i].q.front()] = windows[i].popTime;//窗口有用户则完成时间更新,否则该用户无法完成任务
    }
    int query, timestamp;
    for (int i=0;i<q;i++) {
        scanf("%d", &query);
        timestamp = finished[query];//完成时间赋值,=-1则输出sorry
        if (timestamp == -1) {
            printf("Sorry\n");
            continue;
        }
        printf("%02d:%02d\n",timestamp / 60 + 8, timestamp % 60);//小时,分钟
    }
    return 0;
}

 

标签:customers,int,08,30,will,windows,Waiting,1014,line
来源: https://www.cnblogs.com/cgy-home/p/15191453.html