(備忘録)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