(備忘録)AtCoderをやって 4

問題1

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

制約

N は 1 以上 100 以下の整数

a i(1≤i≤N) は 1 以上 100 以下の整数

自分の回答(他の方の回答参考にしました)

最初はmaxを使って交互に大きい数を取っていけば良いのか?と思いましたが、上手く行かず詰まりました。 sort.reverseを使って配列内の数値を大きい順に並び替えた上でeach.with_indexでインデックス番号を付けて あとはif文でi % 2の余りで条件分けすれば良かった訳ですね

N = gets.to_i
arr = gets.chomp.split(' ').map(&:to_i)
Arr = arr.sort.reverse
a = 0
b = 0
Arr.each.with_index(1) { |n, i|
  if i % 2 == 1
    a += n
  else i % 2 == 0
    b += n
  end
}
puts a - b

問題2

X 段重ねの鏡餅 (X≥1) とは、X 枚の円形の餅を縦に積み重ねたものであって、どの餅もその真下の餅より直径が小さい(一番下の餅を除く)もののことです。例えば、直径 10、8、6 センチメートルの餅をこの順に下から積み重ねると 3 段重ねの鏡餅になり、餅を一枚だけ置くと 1 段重ねの鏡餅になります。 ダックスフンドのルンルンは N 枚の円形の餅を持っていて、そのうち i 枚目の餅の直径は d iセンチメートルです。これらの餅のうち一部または全部を使って鏡餅を作るとき、最大で何段重ねの鏡餅を作ることができるでしょうか。

制約

1≤N≤100

1≤di≤100

入力値はすべて整数である。

自分の回答

これはすんなり回答出来ました

n = gets.chomp.to_i
x = n.times.map{gets.to_i}
puts x.uniq.size

その他回答例

timesメソッドはブロックを取るというの忘れがち Integer#times (Ruby 3.1 リファレンスマニュアル)

n = gets.to_i
d = []
n.times {d << gets.to_i}
puts d.uniq.count