标签:include 无法 printf tin customers represent cannot += limits
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. *Custome**r*5 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 *custome**r*5 at 08:10.
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.
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.
2 2 7 5
1 2 6 4 3 534 2
3 4 5 6 7
08:07
08:06
08:10
17:00
Sorry
这题有个坑,如果有人在17:00之前到了窗口前,就必须完成此人的业务。即,17:00前开始服务的,就必须服务完。
我自己写了一组样例,方便大家调试自己的程序
INPUT
2 1 4 4
600 539 400 200
1 2 3 4
OUPUT
18:00
16:59
23:39
Sorry
#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <string.h>
#include <algorithm>
#include <cmath>
#include <map>
#include <limits.h> 
using namespace std;
int N, M, K, Q;
int t[1000 + 10]; //记录每个人咨询的时间 
vector<int> myv[30]; // 模拟每个窗口前的人的标号 1-K 
int pos = 1; //要插入到黄线内的人所在的位置 
int num = 0; //结束的人数 
int now = 0; // 当前的时间 
bool cmp1(vector<int> a, vector<int> b){
    return a.size() < b.size();
}
int main() {
    cin >> N >> M >> K >> Q;
    for(int i = 1; i <= K; i++){
        cin >> t[i];
    }
    while(num < K){
        // 进入黄线 
        vector<int> *min_t = min_element(myv + 1, myv + N + 1, cmp1);
        while(pos <= K && (*min_t).size() != M){
            int vi = min_t - myv;
            myv[vi].push_back(pos);
            //cout << vi << " " << pos << " " << now << endl;
            min_t = min_element(myv + 1, myv + N + 1, cmp1);
            pos++;
        }
        // 咨询业务 
        int flag = true;
        while(flag){
            if(num == K)    break;
            now++;
            for(int i = 1; i <= N; i++){
                if(myv[i].size()){
                    t[myv[i][0]]--;
                    if(t[myv[i][0]] == 0){
                        flag = false;   //有人完成,需要插入人 
                        t[myv[i][0]] = now;
                        num++;
                        myv[i].erase(myv[i].begin(), myv[i].begin() + 1);
                        //防止样例中,在540(17:00)刚刚结束时,再从第1变成第0 
                        if(now == 540){
                            for(int z = 0; z < myv[i].size(); z++){
                                t[myv[i][z]] = INT_MAX;
                            } 
                        }
                    }
                }
            }
            if(now >= 540)  break;
        }
        if(now >= 540){
            //把每个队伍的第一个咨询结束,不是第一个的无法完成咨询业务(INT_MAX) 
            for(int i = 1; i <= N; i++){
                for(int j = 0; j < myv[i].size(); j++){
                    if(j == 0 && t[myv[i][0]] != INT_MAX){
                        t[myv[i][0]] += now;
                    }
                    else{
                        t[myv[i][j]] = INT_MAX;
                    }
                }
            }
            // 还未插入到黄线内部的人,也无法完成咨询业务 
            while(pos <= K){
                t[pos++] = INT_MAX;
            }
            break;
        }
    }
    for(int i = 1; i <= Q; i++){
        int q = 0;
        cin >> q;
        if(t[q] == INT_MAX) cout << "Sorry" << endl;
        else printf("%02d:%02d\n", 8 + t[q] / 60, t[q] % 60);
    }
    return 0; 
}标签:include 无法 printf tin customers represent cannot += limits
原文地址:https://www.cnblogs.com/woxiaosade/p/12368308.html