問題
N枚のカードがあります. i枚目のカードには, aiという数が書かれています.
Alice と Bob は, これらのカードを使ってゲームを行います. ゲームでは, Alice と Bob が交互に 1 枚ずつカードを取っていきます. Alice が先にカードを取ります.
2 人がすべてのカードを取ったときゲームは終了し, 取ったカードの数の合計がその人の得点になります. 2 人とも自分の得点を最大化するように最適な戦略を取った時, Alice は Bob より何点多く取るか求めてください.
入出力例
入力例 2 3 1 出力例 2 最初,Aliceは3が書かれたカードを取ります. 次に,Bobは1が書かれたカードを取ります. 得点差は3-1=2となります.
自分の回答
def CardgameforTwo(numbers)
alice_point = 0
count = 0
numbers = numbers.sort.reverse
numbers.each do |number|
if count % 2 == 0
alice_point += number
count += 1
else
alice_point -= number
count += 1
end
end
p alice_point
end
amount = gets.chomp.to_i
numbers = gets.chomp.split(" ").map(&:to_i)
CardgameforTwo(numbers)
入力されたカードの番号をnumbersに入れて、.sort.reverseで番号の高い順に並べます。
そして、奇数番目のものはAliceの得点(alice_point)となるので、pointに加算していきます。偶数番目の番号はBobの得点となるので、Aliceの得点から減算していけば、答えは求まります。
今までのB問題に比べて、簡単に感じました。また、前回学んだ、自己代入演算子が早速役に立ちました。
もっとよくする
def CardgameforTwo(numbers)
point = 0
count = 0
numbers = numbers.sort.reverse
numbers.each do |number|
count % 2 == 0 ? point += number : point -= number
count += 1
end
p point
end
amount = gets.chomp.to_i
numbers = gets.chomp.split(" ").map(&:to_i)
CardgameforTwo(numbers)
if文をワンライナーで書くことで、コードの記述を短くしました。最初からワンライナーでかけないかなと思っていたのですが、count += 1を三項演算子の中に入れる方法がわからなかったので、諦めました。後になって、count += 1だけ三項演算子だけ外に出せばいいのだと思いつきました。