AtCorder/ABC(その1)
ABC001
A - 積雪深差
puts gets.to_i - gets.to_i
B - 視程の通報
ans = case (m = gets.to_i) when 0...100 then 0 when 100..5000 then m / 100 when 6000..30000 then m / 1000 + 50 when 35000..70000 then (m / 1000 - 30) / 5 + 80 else 89 end puts sprintf "%02d", ans
C - 風力観測
Houi = %W(NNE NE ENE E ESE SE SSE S SSW SW WSW W WNW NW NNW) Fuuryoku_table = [[0.0, 0.2], [0.3, 1.5], [1.6, 3.3], [3.4, 5.4], [5.5, 7.9], [8.0, 10.7], [10.8, 13.8], [13.9, 17.1], [17.2, 20.7], [20.8, 24.4], [24.5, 28.4], [28.5, 32.6]] deg, dis = gets.split.map(&:to_i) kazamuki = "N" 112.5.step(3265.5, 225).with_index do |d, i| kazamuki = Houi[i] if d <= deg && deg < d + 225 end fuusoku = (dis / 60.0).round(1) fuuryoku = 12 Fuuryoku_table.each_with_index do |f, i| fuuryoku = i if fuusoku.between?(f.first, f.last) end kazamuki = "C" if fuuryoku.zero? puts "#{kazamuki} #{fuuryoku}"
D - 感雨時刻の整理
memo = gets.to_i.times.map {gets.split("-").map(&:to_i)} modified = memo.map do |t0| t0.map.with_index do |t, i| m = (t / 100) * 60 + t % 100 m += 4 if i > 0 m = (m / 5) * 5 (m / 60) * 100 + m % 60 end end.sort be, af = modified.shift modified.each do |s, e| if s.between?(be, af) af = e if e > af else puts sprintf "%04d-%04d", be, af be, af = s, e end end puts sprintf "%04d-%04d", be, af
5分単位の時刻に丸めるのが上手くいっていなかった。きちんと分に直してやらないといけないのね。
別解。
Day = 60 * 24 work = Array.new(Day + 1, 0) gets.to_i.times.map {gets.split("-").map(&:to_i)}.each do |t0| t0.each_with_index do |t, i| m = (t / 100) * 60 + t % 100 m += 4 if i > 0 m = (m / 5) * 5 work[m] += i.zero? ? 1 : -1 end end Day.times {|i| work[i + 1] += work[i]} be = nil (Day + 1).times do |t| if !be && work[t] > 0 be = (t / 60) * 100 + t % 60 elsif be && work[t] < 1 af = (t / 60) * 100 + t % 60 puts sprintf "%04d-%04d", be, af be = nil end end
いもす法。
ABC002
A - 正直者
a, b = gets.split.map(&:to_i)
puts a > b ? a : b
あるいは
puts gets.split.map(&:to_i).max
B - 罠
puts (gets.chomp.chars - %W(a i u e o)).join
C - 直訴
xa, ya, xb, yb, xc, yc = gets.split.map(&:to_i) puts ((xa - xc) * (yb - yc) - (xb - xc) * (ya - yc)).abs / 2.0
D - 派閥
n, m = gets.split.map(&:to_i) relations = Hash.new {|h, k| h[k] = [k]} m.times do x, y = gets.split.map(&:to_i) relations[x] << y relations[y] << x end n.downto(1) do |i| [*1..n].combination(i) do |persons| if persons.all? {|p| persons & relations[p] == persons} puts i exit end end end
最大クリーク問題だってさ。最大で12人しかいないので、総当りで解いている。
ABC003
A - AtCoder社の給料
n = gets.to_i puts (1..n).inject(0) {|acc, i| acc + 10000 * i * Rational(1, n)}.to_i