公式

A - 屋台の営業日数 / Number of Days a Food Stall Is Open 解説 by admin

GPT 5.2 High

概要

1 日あたりの「売上合計」と「人件費合計」の差だけに注目し、所持金が減り続けるなら何日もつかを計算し、減らないなら無限に営業できる(-1)と判定します。

考察

1 日営業すると、所持金は
\(+\left(\sum_{i=1}^{N}A_i\right)-\left(\sum_{j=1}^{M}B_j\right)\)
だけ変化します。ここで

  • 売上合計 \(X=\sum A_i\)
  • 人件費合計 \(Y=\sum B_j\)

とおくと、1 日あたりの増減は \(X-Y\) 円です。

重要な気づき

毎日の変化が一定なので、日ごとのシミュレーションは不要です。

  • もし \(X \ge Y\) なら、1 日あたりの増減 \(X-Y\)\(0\) 以上
    → 所持金は減らない(増えるか、変わらない)
    → 初期資金 \(S \ge 0\) なので 何日でも営業可能(答えは -1
  • もし \(X < Y\) なら、1 日あたり \(d=Y-X>0\) だけ所持金が減る
    \(k\) 日後の所持金は \(S-kd\)
    → 営業後(給料支払い後)に \(0\) 未満は禁止なので
    \(S-kd \ge 0 \;\Rightarrow\; k \le \left\lfloor \dfrac{S}{d}\right\rfloor\)

よって最大日数は \(\left\lfloor \dfrac{S}{d}\right\rfloor\) です。

素朴なアプローチがダメな理由

「所持金が尽きるまで 1 日ずつ減らす」シミュレーションをすると、最大で \(S\)\(10^{18}\) なので \(10^{18}\) 回ループになり得て現実的ではありません(TLE)。

具体例

  • 売上合計 \(X=100\)、人件費合計 \(Y=130\)、初期資金 \(S=1000\)
    \(d=30\) なので最大日数は \(1000//30=33\)
    (33 日後は \(1000-33\cdot 30=10\)、34 日後は \(-20\) でアウト)

アルゴリズム

  1. \(X=\sum_{i=1}^{N}A_i\)\(Y=\sum_{j=1}^{M}B_j\) を計算する
  2. もし \(X \ge Y\) なら -1 を出力する(無限に営業可能)
  3. そうでなければ \(d=Y-X\) として、\(\left\lfloor \dfrac{S}{d}\right\rfloor\) を出力する

計算量

  • 時間計算量: \(O(N+M)\)(配列の総和を取るだけ)
  • 空間計算量: \(O(1)\)(入力配列を除けば定数)

実装のポイント

  • \(S\) は最大 \(10^{18}\) なので、計算は 64bit 整数相当が必要(Python の int なら安全)

  • 判定は必ず先に sumA >= sumB を行い、無限ケースを -1 で処理する

  • 減少する場合の答えは S // d(切り捨て除算)でそのまま求まる

    ソースコード

import sys

def main():
    input = sys.stdin.readline
    N, M, S = map(int, input().split())
    A = list(map(int, input().split()))
    B = list(map(int, input().split()))

    sumA = sum(A)
    sumB = sum(B)

    if sumA >= sumB:
        print(-1)
    else:
        d = sumB - sumA
        print(S // d)

if __name__ == "__main__":
    main()

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

投稿日時:
最終更新: