ABC015
rubyのお勉強をしてました。
- -
B : 高橋くんの集計
- 本番で出したコードそのまま。
- 0を除くのにselectを使ってみたけど、配列の引き算でもいけるらしくてこわい。
N = gets a = gets.chomp.split.map(&:to_i).select { |i| i > 0 } puts (a.reduce(:+)+a.size-1)/a.size
C : 高橋くんのバグ探し
- 本番で書いたものをtimesとか3項演算子とか使って整理した。
N, K = gets.chomp.split.map(&:to_i) dp = Array.new(N+1){Array.new(128){0}} dp[0][0] = 1 N.times { |i| gets.chomp.split.map(&:to_i).each { |val| 128.times { |j| dp[i+1][j^val] |= dp[i][j] } } } puts dp[N][0] == 0 ? "Nothing" : "Found"
D : 高橋くんの苦悩
- 本番ではTLE不可避だったのでカッとなってC++を使って通した。82ms。
- sune2さんが優先度をキーにすると良いと仰ってたので従ったらrubyでも通った。761ms。
- aとbの最小値を取るのは [a,b].min より a
W = gets.chomp.to_i N, K = gets.chomp.split.map(&:to_i) dp = Array.new(K+1){Array.new(5001){W+1}} dp[0][0] = 0 res = 0 sum = 0 N.times { |k| A, B = gets.chomp.split.map(&:to_i) [K-1, k].min.downto(0) { |i| sum.downto(0) { |j| dp[i+1][j+B] = dp[i+1][j+B] < dp[i][j] + A ? dp[i+1][j+B] : dp[i][j]+A } } sum += B } 5001.times { |j| (K+1).times { |i| res = j if dp[i][j] <= W } } puts res
- -
記事が短く済んで良いですね(白目)