キーエンス プログラミング コンテスト 2020
https://atcoder.jp/contests/keyence2020
過去問。
A
h, w, n = readlines.map(&:to_i)
puts (n / [h, w].max.to_f).ceil
B
imos法かと思ったが、ちがっていた。
n = gets.to_i data = n.times.map {gets.split.map(&:to_i)}.map {|x, l| [x - l, x + l]} result = 0 right_min = -Float::INFINITY data.sort {|a, b| a[1] <=> b[1]}.each do |arm| next if right_min > arm[0] result += 1 right_min = arm[1] end puts result
「区間スケジューリング問題」なのだそうである。知らなかった。コードはこれを参考にした。
区間を「終端が早い順」にソートして、とれる順にとる Greedy (貪欲法)で解くことができる
そうである。
C
n, k, s = gets.split.map(&:to_i) a = Array.new(n) n.times do |i| a[i] = if i < k s else s == 1 ? s + 1 : s - 1 end end puts a.join(" ")
皆んなかしこいなあ。思いつかなかった。K個Sを置いて、あとは残りの部分列でSができないようにすると。