解決策はかなり簡単だと思います。
配置する必要のあるアイテムごとに 1 つのスペースがあるような値x
に初期化された配列から始めます。empty
(item, frequency)
次に、頻度の高い順にペアごとに、最初のスロットから交互に にitem
値を割り当てます。x
empty
これがあなたの例でどのように機能するかです:
20*A A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A
10*B ABABABABABABABABABABA_A_A_A_A_A_A_A_A_A
5*C ABABABABABABABABABABACACACACACA_A_A_A_A
2*E ABABABABABABABABABABACACACACACAEAEA_A_A
1*F ABABABABABABABABABABACACACACACAEAEAFA_A
この時点ではx
まだ空のスロットがあるため失敗します。s の間に少なくとも 19 のスロットが必要なため、最初からこれを特定できた可能性がありますが、A
他に 18 のアイテムしかないことに注意してください。
アップデート
レオニダスは、アイテムは「均等に」配布されるべきだと説明しました (つまり、特定の種類のアイテムが k 個あり、埋めるスロットが n 個ある場合、n/k 個のスロットの各「バケット」には、その種類のアイテムが 1 つ含まれている必要があります)。
単純にスロットを交互に使用するのではなく、割り当てを広げることで、この制約に適応できます。この場合 (そして、これを解決できるように 2 つの F を想定しましょう)、次のようになります。
20*A A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A
10*B ABA_ABA_ABA_ABA_ABA_ABA_ABA_ABA_ABA_ABA
5*C ABACABA_ABACABA_ABACABA_ABACABA_ABACABA
2*E ABACABAEABACABA_ABACABAEABACABA_ABACABA
2*F ABACABAEABACABAFABACABAEABACABAFABACABA