2019-06-11に投稿

AtCoder Beginner Contest 088BをPythonで解く

AtCoder Beginner Contest 088BをPythonで解く

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

問題文

N枚のカードがあります. i枚目のカードには, aiという数が書かれています.
Alice と Bob は, これらのカードを使ってゲームを行います. ゲームでは, Alice と Bob が交互に 1 枚ずつカードを取っていきます. Alice が先にカードを取ります.
2 人がすべてのカードを取ったときゲームは終了し, 取ったカードの数の合計がその人の得点になります. 2 人とも自分の得点を最大化するように最適な戦略を取った時, Alice は Bob より何点多く取るか求めてください.

こう考えた

  • リストで標準入力を取得
  • ターンを%2表現してAliceとBobの番を表現
  • (max)を使い最大値を取得しAliceまたはBobに加算
  • removeを用いて配列から最大値を除去

実際書いたコード

N=int(input())
A=list(map(int,input().split()))

Alice=0
Bob=0
n=1

while n<=N:
  if n%2==1:
    Alice=Alice+max(A)
    A.remove(max(A))
    n=n+1
  else:
    Bob=Bob+max(A)
    A.remove(max(A))
    n=n+1
print(Alice-Bob)

🐍やや冗長やけど書くとこんな感じになった。

結果

AC!

🐍やったで。

勉強になったコード

N = int(input())
a = sorted(list(map(int, input().split())), reverse=True)
alice = sum(a[0::2])
bob = sum(a[1::2])
print(abs(alice - bob))

🐍 reverse=Trueで配列を逆にして、リストのstep2にしてsum()で合計値を出しているんやな。

Originally published at www.coderecipe.org

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

aocory

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

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

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

ボードとは?

関連記事

コメント