「長方形が3つ」という点と「辺の長さが整数」という点がポイントです.
考え方
条件を満たす長方形が3つ存在したとする.長方形が3つなので,ある一つの長方形は,辺を$x$軸 or $y$軸方向に目一杯延長しても他の2つの長方形と干渉しない.
そのような長方形を端に寄せて,残った長方形を2分割できるか考えればよい.
2分割の場合には,2つの長方形の辺を$x$軸 or $y$軸方向に目一杯延長できることに着目する.
以下を,「$X,Y$」「$A,B,C$」を入れ替えて全パターン試せば良い.
- 「面積$A$以上の長方形」の一辺を$X$として,もう一辺の長さを求める(
Y2 =
$\lceil A / X \rceil$). - 以下を,「$X,Y2$」を入れ替えた2パターン試す(対称性から,$B,C$の入れ替えは不要).
- 上で求めた「面積$A$以上の長方形」を除いた長方形を考える.この長方形に入れる「面積$B$以上の長方形」の一辺を$X$としてもう一辺の長さを求める(
Y3 =
$\lceil B / X \rceil$). - 面積B以上の長方形を除いて残った長方形の面積(
X * (Y - Y3)
)が$C$以上ならTrue
.
- 上で求めた「面積$A$以上の長方形」を除いた長方形を考える.この長方形に入れる「面積$B$以上の長方形」の一辺を$X$としてもう一辺の長さを求める(
- どれか一つでも
True
ならYesを出力する.
【参考】【競プロ実況】ABC223 E問題【かつっぱ】 - YouTube
回答例
$\lceil a / x \rceil$は,(a + x - 1) // x
でやるのが無難.math.ceil(a / x)
だと通らないケースがあった(ケタが大きいから?見落としているケースが有る?).a // x + bool(a % x)
やa // x + (a % x != 0)
はOK.
X, Y, A, B, C = map(int, input().split()) def f(x, y, a, b, c): y2 = (a + x - 1) // x y -= y2 if y > 0: return g(x, y, b, c) or g(y, x, b, c) else: return False def g(x, y, b, c): y3 = (b + x - 1) // x y -= y3 if x * y >= c: return True else: return False ans = False for x, y in [(X, Y), (Y, X)]: for a, b, c in [(A, B, C), (B, C, A), (C, A, B)]: ans |= f(x, y, a, b, c) print('Yes' if ans else 'No')