0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RubyでAtCoder ABC260(A, B, C)を解いてみた

Posted at

はじめに

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それぞれに対して順に値を足していくことで実装することができます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?