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\) 日分回すと確実に時間切れになります。必要なのは合計の比較だけです。
アルゴリズム
- 入力として \(N, M\) と配列 \(A\) を受け取る。
- \(S = \sum A_i\) を計算する。
- \(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: