【AtCoder:2回目】AtCoder Beginner Contest 127の振り返り(Ruby)

【目次】

【本題】

振り返り

今回は、5/26(土)に開催されたAtCoder Beginner Contest 127の振り返りを行います。

AtCoder Beginner Contest 127 - AtCoder

結果は、2問しか解けないという事で、見事に撃沈しています・・・

なお、前回参加したコンテストはUnratedだったので、今回初めてratingが付きました!

5回参加するまでは、大幅に低く見積もられるそうです。 いずれにしても、水色にはほど遠い・・・

A - Ferris Wheel

問題文 A 歳の高橋君が観覧車に乗ろうとしています。

この観覧車は、 13 歳以上が乗るには B 円 ( B は偶数) かかりますが、 6 歳以上 12 歳以下の人はその半額で乗ることができ、 さらに 5 歳以下の人は無料で乗ることができます。

高橋君が観覧車に乗るには何円かかるかを求めてください。

0〜5が無料で、6〜12が半額、それ以外は通常価格という条件式を組めば良いと考えました。

私の回答はこちらです。

a,b=gets.split.map &:to_i

case a
  when 0..5
    p 0
  when 6..12
    p b / 2
  else
    p b
end

今回はcase文で解きましたが、caseだと比較演算子が使えなかったので、範囲オブジェクトで数値を表しています。

ちなみに、IF文だとこんな感じでしょうか。

a,b=gets.split.map &:to_i

if a <= 5
  p 0
elsif a <= 12
  p b/2
else
  p b
end

B - Algae

問題文 ある池に生えている藻類は、以下のように成長します。

西暦 i 年になる瞬間に生えている重さの合計を x i グラムとすると、 i ≥ 2000 に対して、以下の式が成り立ちます:

x i + 1

= r x i − D r , D , x 2000 が与えられます。 x 2001 , ..., x 2010 を計算し、順に出力してください。

10回繰り返しで処理を回して、一番初めは「r * x - d」で計算し、その後は値を更新しながら計算と出力を繰り返していく方法を考えました。

その回答がこちらです。

r,d,x=gets.split.map &:to_i

 before_reef = 0

10.times do
  if before_reef == 0
    reef = r * x - d
  else
    reef = r * before_reef - d
  end
  p reef
  before_reef = reef
end

ただ他の回答などを見ると、もっとシンプルに解ける方法がありました。

r,d,x=gets.split.map &:to_i

10.times do
  p x = r * x - d
end

いちいち別の変数に定義し直す必要無いやん・・・

C - Prison

問題文 N 枚の ID カードと M 個のゲートがあります。

i 番目のゲートは L i , L i + 1 , . . . , R i 番目の ID カードのうちどれか 1 枚を持っていれば通過できます。

1 枚だけで全てのゲートを通過できる ID カードは何枚あるでしょうか。

各L〜Rの範囲の値の最小公約数が答えるなると考えて回答した内容が下記です。

sss = []
while bbb = $stdin.gets do
  sss << bbb.chomp.split(" ")
end

l = 0
r = 100000

sss.delete_at(0)

sss.each do |s|
  l = s[0].to_i if s[0].to_i > l
  r = s[1].to_i if s[1].to_i < r
end

p r - l + 1

こちらサンプルは通りましたが、いくつかのテストケースでエラーになってしまいました。

これを解消させたコードがこちらです。

N,M=gets.split.map &:to_i
l=0
r=100000
M.times{
    a,b=gets.split.map &:to_i
    l = a if l < a
    r = b if r > b
}
puts [r-l+1, 0].max