B - 荷物の搬出 / Luggage Removal Editorial by admin Editorial for printing
GPT 5.2 High概要
各回で「合計 \(K\) 以下の連続区間」を取り除けるとき、最終的に搬出できる荷物の最大個数を求める問題です。結論として、答えは \(A_i \le K\) を満たす荷物の個数になります。
考察
重要な観察は次の2点です(制約より \(A_i \ge 1\) の正の整数であることが効きます)。
1. \(A_i > K\) の荷物は絶対に搬出できない
どんな搬出操作でも選ぶ区間の重さ合計は \(K\) 以下でなければなりません。
しかし \(A_i > K\) の荷物を含む区間を選ぶと、その区間の合計は少なくとも \(A_i\) なので必ず \(K\) を超えます(他の荷物は正なので足すほど増える)。
したがって、\(A_i > K\) の荷物はどの操作でも取り除けません。
2. \(A_i \le K\) の荷物は必ず搬出できる
逆に \(A_i \le K\) なら、その荷物だけの区間(長さ1)を選べば合計は \(A_i \le K\) なので、単独で搬出可能です。
これを全ての \(A_i \le K\) について繰り返せばよく、途中で列が詰まって隣接関係が変わっても「単独で選ぶ」戦略には影響がありません。
以上より、 - 搬出できない荷物:\(A_i > K\) - 必ず搬出できる荷物:\(A_i \le K\)
なので最大搬出個数は \(A_i \le K\) の個数です。
(例)\(K=5,\ A=[2,7,3,10,5]\)
\(7,10\) は \(K\) を超えるので絶対に無理。\(2,3,5\) は単独で搬出できるので最大は \(3\) 個。
素朴なアプローチが不要な理由
一見すると「区間を選ぶ」ので、貪欲やDPで最適な区間の取り方を考えたくなります。しかし上の観察により、区間の取り方を工夫しても \(A_i>K\) を消せないため、問題は単なる個数カウントに帰着します。
そのため、区間探索やシミュレーション(最悪 \(O(N^2)\) など)は過剰で、制約 \(N \le 2\times 10^5\) では無駄になります。
アルゴリズム
- 配列 \(A\) を左から順に見る。
- \(A_i \le K\) ならカウントを1増やす。
- カウントを出力する。
これが最大搬出個数です(各荷物は単独搬出でき、\(A_i>K\) は不可能)。
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(1)\)(入力を逐次処理するなら追加配列不要)
実装のポイント
\(K, A_i\) が最大 \(10^{18}\) ですが、Python の
intならそのまま扱えます。A = map(int, input().split())として逐次走査し、sum(1 for x in A if x <= K)で簡潔に数えられます。ソースコード
import sys
def main():
input = sys.stdin.readline
N, K = map(int, input().split())
A = map(int, input().split())
ans = sum(1 for x in A if x <= K)
print(ans)
if __name__ == "__main__":
main()
この解説は gpt-5.2-high によって生成されました。
posted:
last update: