【yukicoder】No.804 野菜が苦手

久々に競技プログラミングやります。やり方を忘れているので簡単な問題から徐々に思い出していきます。

問題

問題はこちら

解法

食べられる野菜の最大の数を x とします。
すると問題分より下記の関係を満たす。

野菜の個数は最大 A
x \leq A

Cx 個の肉を食べる必要があるが、肉の個数は最大 B
Cx \leq B

野菜と肉を Cx + x 個食べる必要があるが、合わせて最大 D 個までしか食べれない
Cx + x \leq D

したがって x \leq Ax \leq B / Cx \leq D / (C + 1) を満たす最大の整数  x を出力する。

Python3

Python久しぶりに書く。

コード

n=list(map(int,input().split()))
x=n[3]//(n[2]+1)
y=n[1]//n[2]
a=x if x<y else y
print(a if a<n[0] else n[0])

解法通りに各等式の右辺の商をとって、一番小さい商が答え。

再考

Pythonminがあった(まぁ普通あるか)。これ使えば短く書ける。

n=list(map(int,input().split()))
print(min(n[0], n[1] // n[2], n[3] // (n[2] + 1)))