序文
あまり技術的な話ではないのですが、AtCoderで困ったWAの出方することありませんか?
自分はABC095 - Half and Halfを解いた際に出てきたのですが、
↑この一個だけ間違っているケースめちゃくちゃ困りません??
自分は初めて出会したので対処が分からず、コードを書き直して、素直に全探索しました。
助けてくだs……
このような時どのような方法でロジックエラーを解決すればいいか、ご存知の方いらっしゃればコメントしてくださると幸いですm(_ _)m
↓以下、自分が提出した回答です。
a, b, c, x, y= map(int, input().split())
C= c*2
pay_for= 0
if a+b<= C:
pay_for= a*x+ b*y
else:
if x> y:
pay_for= y*C+ (x-y)*a
for i in range(x-y):
estimate= C*(x-i)+ a*i
if estimate< pay_for:
pay_for= estimate
else:
pay_for= x*C+ (y-x)*b
for i in range(y-x):
estimate= C*(y-i)+ a*i
if estimate< pay_for:
pay_for= estimate
print(pay_for)
自分は、最初a+b
とc*2
の大小関係に着目することで計算量を減らせると考えました。
その後の場合分けで、a+b< C
の時に、ピッタリ a:X枚、b:Y枚になるように買うパターンと、
ABピザを多めに買って、各々max(X, Y)
枚のピザを買うパターンに気付き、
一応多めに買う方を全探索で出費を最小化するプログラムを書きました。
結果的に、何か探索漏れがあったのか一個だけWAを出してしまいました。
参考までに
その後コードを書き直して提出したら、難なくACをもらいました。
正直、上記のコードの何が悪かったのかがあまり分からないです……
a, b, c, x, y= map(int, input().split())
C= c*2
pay_for= 10**10
if x> y:
for i in range(x+1):
z=i
if i< y:
estimate= C*z+ a*(x-z)+ b*(y-z)
else:
estimate= C*z+ a*(x-z)
if estimate< pay_for:
pay_for= estimate
else :
for i in range(y+1):
z=i
if i< x:
estimate= C*z+ a*(x-z)+ b*(y-z)
else:
estimate= C*z+ b*(y-z)
if estimate< pay_for:
pay_for= estimate
print(pay_for)
①:a+b
とc*2
の大小関係の場合分けで、場合分けに漏れがある。
②探索回数がx-y
とy-x
だったので、探索漏れがある。
のどちらかなんですけど、分からねえ……
結論
男は黙って全探索‼️👊
ご高覧ありがとうございましたm(_ _)m