はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC308のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。
A - New Scheme
a-308.rb
s = gets.split.map(&:to_i)
puts s == s.sort && s.all?{ 100 <= _1 && _1 <= 675 && _1 % 25 == 0} ? "Yes" : "No"
B - Default Price
b-308.rb
n, m = gets.split.map(&:to_i)
c = gets.split
d = gets.split
a = gets.split.map(&:to_i)
b = a.shift
hash = d.zip(a).to_h
puts c.map{
hash[_1] ? hash[_1] : b
}.sum
解説
最初に、dとaの長さを揃えるためにshift
メソッドを使ってaの先頭の要素を取り出し、これをbとしておきます。次に、zip
メソッドを使ってdとaの各要素からなる配列をもとに連想配列を作ります。最後に、cの各要素に対してその色がhash
に含まれているかどうかにより値を変更した後、その総和を求めることで解くことができます。
C - Standings
c-308.rb
n = gets.to_i
$array = Array.new(n){ gets.split.map(&:to_i) }
def f(i, j)
return $array[i][j]
end
def function_p(s, t, r)
return s * (t + r)
end
result = [*1..n].sort! { |i, j|
i -= 1
j -= 1
a1, b1 = f(i, 0), f(i, 1)
a2, b2 = f(j, 0), f(j, 1)
p1, p2 = function_p(a1, a2, b2), function_p(a2, a1, b1)
p1 == p2 ? i <=> j : p2 <=> p1
}
puts result.join(" ")
解説
(他の方の提出結果を参考にしました)
誤差を考慮して、分母を払った状態で計算します。このとき、確率が等しければi<=>j
でインデックスの大小を比較し、そうでなければp2<=>p1
で各要素の大小を比較することで答えを求めることができます。
参考