公式
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\) でアウト)
アルゴリズム
- \(X=\sum_{i=1}^{N}A_i\)、\(Y=\sum_{j=1}^{M}B_j\) を計算する
- もし \(X \ge Y\) なら
-1を出力する(無限に営業可能) - そうでなければ \(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 によって生成されました。
投稿日時:
最終更新: