【AtCoder:11回目】AtCoder Beginner Contest 134の振り返り(Ruby)

【目次】

【本題】

振り返り

今回は 7/21(土)に開催されたAtCoder Beginner Contest 134の振り返りを行います。

2週間ぶりのAtCoderです。

AtCoder Beginner Contest 134 - AtCoder

今回は3問回答できました。やっぱり4問目以降は競プロの勉強しないと厳しそう・・・

レーティング微増

A - Dodecagon

問題文 半径 a の円に内接する正十二角形の面積は 3 a 2 であることが知られています。

整数 r が与えられるので、半径 r の円に内接する正十二角形の面積を求めて下さい。

制約 1 ≦ r ≦ 100 r は整数である。

私の回答はこちら

r = gets.to_i
puts 3*r*r

こう書けばワンライナーに出来ましたね

puts 3 * gets.to_i ** 2

B - Golden Apple

問題文 一列に並んだ N 本の林檎の木のうちいずれかに黄金の林檎が実ると言われています。

そこで、何人かの監視員を配置してどの林檎の木もいずれかの監視員に監視された状態にしたいです。

それぞれの監視員は N 本の木のうちいずれかに配置します。便宜上、これらの木に 1 から N までの番号をつけます。番号 i の木に配置された監視員は、番号が i − D 以上 i + D 以下のすべての林檎の木を監視します。

条件を満たすために少なくとも何人の監視員を配置する必要があるか求めてください。

制約 入力は全て整数である。 1 ≤ N ≤ 20 1 ≤ D ≤ 20

私の回答はこちらです。

n,d=gets.split.map(&:to_i)
puts (n/(d*2+1).to_f).ceil

/よりceilが先に評価されてしまうので、()で制御する必要があります。

C - Exception Handling

問題文 長さ N の数列 A 1 , A 2 , . . . , A N が与えられます。 1 以上 N 以下の各整数 i に対し、次の問いに答えてください。

数列中の A i を除く N − 1 個の要素のうちの最大の値を求めよ。 制約 2 ≤ N ≤ 200000 1 ≤ A i ≤ 200000 入力中のすべての値は整数である。

私の回答はこちらです。

n = gets.to_i
nums = []
n.times { nums << gets.to_i }
 
sort_nums = nums.sort{|x,y| y<=>x}
max_unip = true if sort_nums[0] != sort_nums[1]
 
nums.each do |num|
  if num != sort_nums[0]
    puts sort_nums[0]
  elsif max_unip == true
    puts sort_nums[1]
  else
    puts sort_nums[0]
  end
end

こちらの方がスマートですね

n = gets.to_i
a = Array.new(n) { gets.to_i }
m1, m2 = a.max(2)
a.each {|x| puts(x < m1 ? m1 : m2) }