ABC181
https://atcoder.jp/contests/abc181
A: Heavy Rotation
n = gets.to_i puts n.even? ? "White" : "Black"
B: Trapezoid Sum
n = gets.to_i abs = n.times.map {gets.split.map(&:to_i)} puts abs.map {|a, b| (b - a + 1) * (a + b) / 2}.sum
C: Collinearity
n = gets.to_i xys = n.times.map {gets.split.map(&:to_i)} f = xys.combination(3).any? {|p1, p2, p3| v1x = p2[0] - p1[0] v1y = p2[1] - p1[1] v2x = p3[0] - p1[0] v2y = p3[1] - p1[1] v1x * v2y == v1y * v2x } puts f ? "Yes" : "No"
D: Hachi
与えられた文字列str
が 3桁以下の場合は、順列による総当り。
そうでない場合は、8で割り切れる数は下3桁で決まることを使う。但しここでは 0 を含んではいけないことに注意。そのような 3桁の数をすべて求め、使う数字の個数の一覧を登録しておく(変数table
)。また、同様にstr
で使う数字のそれぞれの個数も調べる(変数tmp
)。あとは、table
に含まれるcnt
の中に、「条件」を満たすものがひとつでもあればよい。「条件」とは、tmp
がうまくcnt
を「含んで」いること。
table = (100..999).map {|i| next if (i % 8).nonzero? ds = i.digits next if ds.include?(0) count = Array.new(9, 0) ds.each {|n| count[n - 1] += 1} count }.compact str = gets.chomp if str.size <= 3 f = str.chars.permutation.any? {|cs| (cs.join.to_i % 8).zero? } else tmp = Array.new(9, 0) str.each_char {|c| tmp[c.to_i - 1] += 1} f = table.any? {|cnt| sum = 0 cnt.zip(tmp).each {|a, b| sum += a if b >= a} sum == 3 } end puts f ? "Yes" : "No"
E: Transformable Teacher
n, m = gets.split.map(&:to_i) hs = gets.split.map(&:to_i).sort ws = gets.split.map(&:to_i).sort s = t = 0 dp1 = [0] + hs.each_slice(2).map {|a, b| s += (b || 0) - a} dp2 = [0] + hs.reverse.each_slice(2).map {|a, b| t += a - (b || 0)} j = 0 ans = (0..n / 2).map {|i| h = hs[2 * i] j += 1 while j + 1 < m && (ws[j + 1] - h).abs <= (ws[j] - h).abs dp1[i] + dp2[n / 2 - i] + (h - ws[j]).abs }.min puts ans
これはこの解答をパクった。いまひとつわからない。