「必ずAliceが勝ち、Bobが負ける」ABC088Bを解いた!

目次

 

問題

atcoder.jp

 

これはCard Game for Two ではなく、 Card Game for Alice です。

Card Game for Two だとすると、Bob はAliceに負けたい、ということになります。

 

 回答

# カードの枚数をしかたなく受取る
gets
# カードの数字を配列"cards"とする
cards = gets.split.map(&:to_i)

# Aliceさんがとれるカードを配列"alice"とする
alice = cards.sort.reverse.each_slice(2).map(&:first)

# Aliceさんの総得点の2倍から、AliceさんとBobさんの合計得点を引いて出力
puts 2 * alice.sum - cards.sum

 

学んだ処理

 

# Aliceさんがとれるカードを配列"alice"とする
alice = cards.sort.reverse.each_slice(2).map(&:first)

この"alice = "の行では、次のような処理をしています。

「2人がとるカードを大きい順に並べて、Aliceが取れるカードだけを抽出する」

 

問題ページの入力例3で説明します。

4
20 18 2 18
cards

この配列の値は

[20, 18, 2, 18]

 

cards.sort

整数型の配列なので、昇順に並び替え(リファレンス)、値は

[2, 18, 18, 20]

 

cards.sort.reverse

配列を逆順にして、値は

[20, 18, 18, 2]

 

cards.sort.reverse.each_slice(2)

2つずつの要素をブロックにして(リファレンス)、値は

[20, 18] [18, 2]

 

cards.sort.reverse.each_slice(2).map(&:first)

各ブロックの1番目の値を返して(参考記事)、値は

[20] [18]

 

感想

持っている知識と調べた情報を組み合わせてアルゴリズムを完成させることができました。

なかなか達成感があります。

もっとサクサクと解けるように、慣れていきたいです。