ABC158

https://atcoder.jp/contests/abc158
過去問。

A:Station and Bus

s = gets.chomp
puts (s == "AAA" || s == "BBB") ? "No" : "Yes"

B:Count Balls

n, a, b = gets.split.map(&:to_i)

blue_ball = (n / (a + b)) * a
remainder = n % (a + b)
blue_ball += (remainder >= a) ? a : remainder

puts blue_ball

C:Tax Increase

8%と10%の場合それぞれにおいて、消費税分から考えられる税抜価格の下限と上限を Rational で求める。それが f1() と f2()。そこから、条件に適合する税抜価格が存在するか、存在するならその下限を求めれば、それが答え。その判定を行うのが find()。上限の小さい方が整数の場合とそうでない場合で判定がちがってくるので注意。

def f1(a)
  [a / (8/100r), (a + 1) / (8/100r)]
end

def f2(b)
  [b / (10/100r), (b + 1) / (10/100r)]
end

def find(a1, a2)
  bgn = [a1[0], a2[0]].max.ceil
  ed = [a1[1], a2[1]].min
  f = if ed == ed.floor
    bgn < ed
  else
    bgn <= ed.floor
  end
  f ? bgn : -1
end

a, b = gets.split.map(&:to_i)
puts find(f1(a), f2(b))

なかなかむずかしかった。一発でいってホッとした。

D:String Formation

str = gets.chomp
q = gets.to_i
querys = q.times.map {gets.split}

querys.each do |ary|
  if ary[0] == "1"
    str.reverse!
  else
    if ary[1] == "1"
      str = ary[2] + str
    else
      str += ary[2]
    end
  end
end

puts str

TLE。素直に reverse を使ってはいけないということらしい。かしこい回答は例えばこれ
ちょっと改良してみる。

str = gets.chomp
q = gets.to_i
querys = q.times.map {gets.split}

dir = true

querys.each do |ary|
  if ary[0] == "1"
    dir = !dir
  else
    if (ary[1] == "1" && dir) || (ary[1] == "2" && !dir)
      str = ary[2] + str
    else
      str += ary[2]
    end
  end
end

puts dir ? str : str.reverse!

やっぱりTLE。「+」でなく「<<」で String を結合しないと遅いらしい。