Official

A - サーバーへのリクエスト分散 / Distributing Requests to Servers Editorial by admin

GPT 5.2 High

概要

各サーバーの処理可能回数 \(A_i\) の合計が、\(M\) 日間で発生するリクエスト数 \(M\) 以上かどうかを判定する問題です。

考察

1 日につき重いリクエストはちょうど 1 件、合計で \(M\) 件発生します。各サーバー \(i\) は最大 \(A_i\) 件まで処理でき、超えるとダウンします。

ここで重要なのは、「どの日にどのサーバーに割り当てるか」には特別な制約がないことです(連続稼働制限などはない)。つまり、最終的に各サーバーが処理した回数が \(A_i\) を超えなければよく、リクエストはすべて同じ 1 単位として扱えます。

したがって、

  • 全サーバーが処理できる総量は \(\sum_{i=1}^{N} A_i\)
  • 必要な総量は \(M\)

なので、\(\sum A_i \ge M\) なら必ず割り当て可能です。実際、残り容量があるサーバーに順に割り当てていけば、合計容量が足りる限り途中で詰まりません(容量が 1 以上残るサーバーが必ず存在するため)。

逆に \(\sum A_i < M\) なら、どんな割り当てをしても総処理数が足りないので不可能です。

具体例:

  • \(A = [2, 1, 3]\) なら合計は \(6\)\(M=5\) なら \(6 \ge 5\) なので Yes
  • \(A = [1, 1]\) なら合計は \(2\)\(M=3\) なら \(2 < 3\) なので No

素朴に「日ごとに割り当て先をシミュレーションする」こともできますが、\(M\) は最大 \(10^9\) なので、\(M\) 日分回すと確実に時間切れになります。必要なのは合計の比較だけです。

アルゴリズム

  1. 入力として \(N, M\) と配列 \(A\) を受け取る。
  2. \(S = \sum A_i\) を計算する。
  3. \(S \ge M\) なら Yes、そうでなければ No を出力する。

計算量

  • 時間計算量: \(O(N)\)\(A_i\) を合計するだけ)
  • 空間計算量: \(O(N)\)(入力配列を保持。合計だけなら \(O(1)\) にもできる)

実装のポイント

  • \(N\) は最大 \(10^5\) なので、合計計算は十分高速ですが、入力は sys.stdin.buffer.read() を使うと安定します。
  • \(\sum A_i\)\(M\) は最大で \(10^{14}\) 程度になり得ますが、Python の整数は桁あふれしないのでそのまま扱えます。

ソースコード

import sys

def main():
    data = list(map(int, sys.stdin.buffer.read().split()))
    N, M = data[0], data[1]
    A = data[2:2+N]
    print("Yes" if sum(A) >= M else "No")

if __name__ == "__main__":
    main()

この解説は gpt-5.2-high によって生成されました。

posted:
last update: