はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC255のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。
A - You should output ARC, though this is ABC.
a-255.rb
r, c = gets.split.map(&:to_i)
a, b = gets.split.map(&:to_i)
d, e = gets.split.map(&:to_i)
if r == 1
puts c == 1 ? a : b
else
puts c == 1 ? d : e
end
B - Light It Up
b-255.rb
n, k = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
array = Array.new(n) { gets.split.map(&:to_i) }
ans = 0
array.each_with_index do |(x, y), index|
next if a.include?(index + 1)
d = a.map{ |nx| (x - array[nx - 1][0]) ** 2 + (y - array[nx - 1][1]) ** 2 }.min
ans = [ans, d].max
end
puts Math.sqrt(ans)
解説
(公式解説を参考にしました)
その人から最も近い人が明かりをもっていれば良いので、答えはその人から最も近い人までの距離の最大値となります。
C - ±1 Operation 1
c-255.rb
def f(a, d, i)
a + i * d
end
x, a, d, n = gets.split.map(&:to_i)
if d < 0
a += d * (n - 1)
d *= -1
end
if x <= a
puts a - x
exit
elsif x >= f(a, d, n - 1)
puts x - f(a, d, n - 1)
exit
end
result = (0..n - 1).bsearch { |i| f(a, d, i) >= x }
ans = [(f(a, d, result) - x).abs, (f(a, d, result - 1) - x).abs].min
puts ans
解説
(公式解説を参考にしました)
最初に、D<0
の場合は与えられた等差数列を反転します。このとき答えは、Xに最も近いSの要素を二分探索して求めた値とXとの差となります。