はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC260のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。
A - A Unique Letter
a-260.rb
s = gets.chomp.chars.tally.invert
puts s[1] ? s[1] : -1
解説
与えらた文字列を連想配列にして、invertメソッドによりkeyとvalueを入れ替えています。
B - Better Students Are Needed!
b-260.rb
n, x, y, z = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
b = gets.split.map(&:to_i)
students = []
n.times do |i|
students << [a[i], b[i], i + 1]
end
ans = []
students.sort_by!{ |a, b, i| [-a, i] }
x.times do |i|
ans << students[i][-1]
end
students = students[x..].sort_by{ |a, b, i| [-b, i] }
y.times do |i|
ans << students[i][-1]
end
students = students[y..].sort_by{ |a, b, i| [-(a + b), i] }
z.times do |i|
ans << students[i][-1]
end
puts ans.sort
解説
sort_byメソッドを使って、「数学の得点が上位X位」「合格していない人のうち、英語の得点が上位Y位」「合格していない人のうち、数学と英語の合計得点が上位Z位」の人をそれぞれ調べ最後に昇順にして出力することで実装することができます。
C - Changing Jewels
c-260.rb
n, x, y = gets.split.map(&:to_i)
r = Array.new(n + 1, 0)
b = Array.new(n + 1, 0)
r[n] = 1
n.downto(2) do|i|
r[i - 1] += r[i]
b[i] += r[i] * x
r[i - 1] += b[i]
b[i - 1] += b[i] * y
end
puts b[1]
解説
動的計画法を使って解くことができます。r[i]:=レベルiの赤い宝石がいくつあるか、b[i]:=レベルiの青い宝石がいくつあるかと定義しておきます。すると、条件文の通りr, bそれぞれに対して順に値を足していくことで実装することができます。