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

これはこの解答をパクった。いまひとつわからない。