은행에 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);