ABC167
https://atcoder.jp/contests/abc167
過去問。
A: Registration
s = gets.chomp t = gets.chomp puts (t[0..-2] == s) ? "Yes" : "No"
B: Easy Linear Programming
a, b, c, k = gets.split.map(&:to_i) score = 0 if a <= k score += a k -= a if b <= k k -= b if c <= k score -= c else score -= k end end else score += k end puts score
C: Skill Up
全探索なのだけれど、ちょっと自信がなかった。一発で通ってホッ。
n, m, x = gets.split.map(&:to_i) books = n.times.map {gets.split.map(&:to_i)} min = 1200001 (1..n).each do |i| books.combination(i) do |selected| cost = 0 f = selected.map {|price, *up| cost += price up }.transpose.map(&:sum).all? {_1 >= x} if f min = cost if cost < min end end end puts (min == 1200001) ? -1 : min
D: Teleporter
これは考えた。エッジケースがむずかしかった。
n, k = gets.split.map(&:to_i) destinations = gets.split.map(&:to_i) teleport = [1] visited = Array.new(200001) visited[1] = true now = 1 while true nxt = destinations[now - 1] teleport << nxt break if visited[nxt] visited[nxt] = true now = nxt end idx = teleport.index(nxt) ts = teleport.size ans = if k < ts teleport[k] else loop_size = ts - idx - 1 teleport[(k - idx) % loop_size + idx] end puts ans