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を作ろうと思ったか

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

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

ボードとは?

関連記事

コメント