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 を結合しないと遅いらしい。