PAT 클래스 A 1014 대기 중(대형 대기열 시뮬레이션 + 형식화된 시간)

원본 제목 링크

은행에 N개의 서비스 창구가 있다고 가정합니다.

대기실을 두 부분으로 나누는 노란색 선이 창 앞에 있습니다.

고객이 줄을 서서 기다리는 규칙은 다음과 같습니다.

노란색 라인 안의 지역은 각 창구 앞에 줄을 설 수 있으며, 각 라인은 최대 M명까지 가능합니다. 이후 고객은 노란색 선 밖에서만 기다릴 수 있습니다. 노란색 줄 밖의 모든 고객은 긴 줄을 섭니다.
고객이 노란색 라인 내로 입장할 때마다 고객은 업무를 처리하기 위해 줄을 서 있는 사람이 가장 적은 창구에서 줄을 서서 기다리게 됩니다. 여러 개의 창구 앞에 줄을 서는 사람의 수가 가장 적으면 고객은 창구 번호가 더 작은 창구를 선택하여 영업을 위해 줄을 서서 기다립니다.
i번째 고객의 처리 시간은 Ti입니다.
오전 08:00부터 선착순 N명의 고객이 영업을 시작합니다.
이제 모든 고객이 거래를 완료하는 데 걸리는 시간을 감안할 때 고객에게 거래를 완료한 정확한 시간을 매번 묻습니다.

예를 들어, 은행에 2개의 서비스 창구가 있고 각 창구의 노란색 선 안에 두 명의 고객이 있을 수 있다고 가정합니다.

이제 5명의 고객이 업무를 처리하기 위해 대기하고 있으며 업무 시간은 각각 1분, 2분, 6분, 4분, 3분입니다.

오전 08:00에 고객 1은 1번 창구, 고객 2는 2번 창구, 고객 3은 1번 창구 앞에서 대기, 고객 4는 2번 창구 앞에서 대기, 고객 5는 밖에서 대기 노란색 선.

08:01에 고객 1이 영업을 마치고 고객 5가 노란색 선 안으로 들어가 1번 창구 앞에서 대기합니다.

고객 2는 08:02, 고객 4는 08:06, 고객 3은 08:07, 고객 5는 08:10에 업무를 완료합니다.

입력 형식
첫 번째 줄에는 총 창 수, 노란색 줄의 각 팀의 최대 길이, 총 고객 수 및 문의 수를 나타내는 4개의 정수 N, M, K, Q가 포함됩니다.

두 번째 줄에는 각 고객이 업무를 처리하는 데 필요한 시간을 나타내는 K개의 정수가 포함됩니다(단위: 분).

세 번째 줄에는 쿼리한 모든 고객의 수를 나타내는 Q 정수가 포함됩니다.

고객은 1부터 K까지 번호가 매겨져 있습니다.

출력 형식
각 문의 고객에 대해 고객이 업무를 완료한 정확한 시간을 출력합니다. 형식은 HH:MM입니다.

은행은 17:00에 새로운 업무를 접수하지 않으므로 17:00 이전에 업무를 시작할 수 없는 고객(즉, 마지막 서비스 시간은 16:59)에 대해 죄송합니다.

데이터 범위
1≤N≤20,
1≤M≤10,
1≤K≤1000,
1≤Q≤K
입력 예:
2 2 7 5
1 2 6 4 3 534 2
3 4 5 6 7
출력 예:
08 :07
08:06
08:10
17:00
죄송합니다

내 솔루션:

#include <bits/stdc++.h>
using namespace std;

const int N = 40;

queue <int> q[N];
int n, m, k, Q;
int sum[N];

int main(){
    cin >> n >> m >> k >> Q;
    
    unordered_map<int, int> hash;
    
    for(int i = 1; i <= k; i ++ ){
        int x;
        cin >> x;
        int t = 0;
        for(int j = 0; j < n; j ++ ){
            if(i <= n * m){
                if(q[j].size() < q[t].size()) t = j;
            } 
            else{
                if(q[j].front() < q[t].front()) t = j;
            }
        }
        sum[t] += x;
        if(i > n * m) q[t].pop();
        q[t].push(sum[t]);
        
        if(sum[t] - x < 540) hash[i] = sum[t];
    }
    
    while(Q -- ){
        int i;
        cin >> i;
        if(hash.count(i)) printf("%02d:%02d\n", hash[i]/60 + 8, hash[i]%60);
        else puts("Sorry");
    }
    
    return 0;
}

보상:

큐 배열 시뮬레이션 큐잉 프로세스 + 해시 테이블을 통해 신속하게 결과 찾기

인쇄 시간 포맷 printf("%02d:%02d\n", hash[i]/60 + 8, hash[i]%60);

Supongo que te gusta

Origin blog.csdn.net/weixin_45660485/article/details/126212512
Recomendado
Clasificación