PAT クラス A 1014 順番待ち (大規模なキューのシミュレーション + フォーマットされた時間)

元のタイトルへのリンク

銀行に N 個のサービス窓口があるとします。

窓口の前に黄色い線があり、待合室を2つに分けています。

お客様が列に並んで待つ際のルールは次のとおりです。

黄色の線で囲まれたエリアでは、各窓口の前に1列ずつ並ぶことができ、各列は最大M名まで収容可能で、N窓口前の列が満席の場合、NM+1番目のお客様となります。以降のお客様は黄色の線の外でのみお待ちいただけます。黄色の線の外側にいるすべての顧客が長い列に並びます。
顧客が黄色の線内に入ると、業務を処理するために列に並んでいる人数が最も少ない窓口の列に並ぶことを選択します。複数の窓口の前に並ぶ人の数が最も少ない場合、顧客は窓口番号の小さい窓口を選んで用事を待つことになります。
i 番目の顧客の処理時間は Ti です。
最初の N 人の顧客は午前 8:00 に営業を受け付けます。
ここで、すべての顧客が業務を完了するまでにかかる時間を考えると、顧客に業務を完了した正確な時刻をそのたびに数回尋ねます。

たとえば、銀行に 2 つの窓口があり、各窓口の黄色の線内に 2 人の顧客がいる可能性があるとします。

現在、5 人の顧客が対応を待っており、営業時間はそれぞれ 1 分、2 分、6 分、4 分、3 分です。

朝 8 時、顧客 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 に業務を完了します。

入力形式
1 行目には N、M、K、Q の 4 つの整数が含まれており、ウィンドウの総数、黄色の線の各チームの最大長、顧客の総数、および問い合わせの数を表します。

2行目はK個の整数で、各顧客の対応時間(単位:分)を示しています。

3 行目には、クエリされたすべての顧客の数を表す Q 個の整数が含まれています。

顧客には 1 から K までの番号が付けられます。

出力形式 問い合わせ
を行った顧客ごとに、顧客が業務を完了した正確な時刻を出力します。形式は HH:MM です。

なお、銀行は17:00に新規取引の受付を終了するため、17:00までに取引を開始できない顧客(つまり、最終サービス時間は16:59)には、「Sorry」と出力します。

データ範囲
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);

おすすめ

転載: blog.csdn.net/weixin_45660485/article/details/126212512