2019-06-11に投稿

AtCoder Beginner Contest 095CをPythonで解く

AtCoder Beginner Contest 095CをPythonで解く

今回は、AtCoder Beginner Contest 095Cを解いていきたいと思います。

問題

ファーストフードチェーン「ピザアット」のメニューは「Aピザ」「Bピザ」「ABピザ」の3種類です。AピザとBピザはまったく異なるピザで、これらをそれぞれ半分に切って組み合わせたものがABピザです。AピザBピザ、ABピザ1枚あたりの値段はそれぞれA円、B円、C円です。

中橋くんは、今夜のパーティーのためにAピザX枚とBピザY枚を用意する必要があります。これらのピザを入手する方法は、AピザやBピザを直接買うかABピザ2枚を買ってAピザ1枚とBピザ1枚に組み替える以外にはありません。このためには最小で何円が必要でしょうか?なお、ピザの組み替えにより、必要な量を超えたピザが発生しても構いません。

考えたこと

  • Cピザが、AピザとBピザの値段両方より高ければA*X+B*Yが最安値。
  • Cピザが、AピザとBピザの両ピザより安ければC*max(X,Y)*2が最安値。
  • Cピザが、AピザかBピザどちらかの1つのピザより安く、かつ安いピザが枚数の多い方ならばC*min(X,Y)*2+min(A,B)*abs(X-Y))
  • Cピザが、AピザかBピザどちらかの1つのピザより安く、かつ高いピザが枚数の多い方ならばC*max(X,Y)*2

🐍これでいけそう。

実装したコード

A,B,C,X,Y=map(int,input().split())
print(min(A*X+B*Y,C*max(X,Y)*2,C*min(X,Y)*2+min(A,B)*abs(X-Y)))

🐍C問題が2行で書けたのは少し嬉しい。

結果

WA

🐍なんでや!

正解のコード

A,B,C,X,Y = map(int,input().split())
print(min(X*A+Y*B,X*2*C+B*max(0,Y-X),Y*2*C+A*max(0,X-Y)))

🐍 X*2*C+B*max(0,Y-X)Y*2*C+A*max(0,X-Y)で分岐しているねんな。

ifで書くとややこしい

a, b, c, x, y = [int(i) for i in input().split()]

if c < a/2 and c < b/2:
    cost = max(x, y)*2*c
elif c < a/2:
    if x < y:
        cost = x*2*c + (y-x)*b
    else:
        cost = x*2*c
elif c < b/2:
    if y < x:
        cost = y*2*c + (x-y)*a
    else:
        cost = y*2*c
elif c < (a+b)/2:
    cost = min(x, y)*2*c+(x-min(x,y))*a + (y-min(x,y))*b
else:
    cost = x*a+y*b
print(cost)

🐍 あかん。書いてて頭破裂しそうになった。

Originally published at www.coderecipe.org
ツイッターでシェア
みんなに共有、忘れないようにメモ

view_list Pythonで競プロ
第3回 Pythonで競プロ|ABC129C|
第4回 AtCoder Beginner Contest 073CをPythonで解く
第5回 AtCoder Beginner Contest 095CをPythonで解く
第6回 AtCoder Beginner Contest 088BをPythonで解く
第7回 AtCoder Beginner Contest 087CをPythonで解く

aocory

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!
ボードとは?

関連記事

コメント