@kyanny's blog

My thoughts, my life. Views/opinions are my own.

AtCoder Beginner Contest 367

atcoder.jp

競技プログラミングコンテンストに初めてリアルタイム参加した。が、開始 5 分以内に参加登録しないとレーティングがつかないルールを知らなくて Unrated になった(サッカーを観に行っていたので 21:45 くらいから始めた)。

A, B に正答して 300 点。C は間に合わなかった。練習は Python3 でやり始めたけど本番は慣れてる Ruby にした。

A は軽く見ていたらだいぶ手こずった。

a, b, c = gets.split(" ").map(&:to_i)

# a, b, c = 21, 8, 14
# a, b, c = 0, 21, 7
# a, b, c = 10, 7, 17

if b < c
  sleeping = b..c
  if sleeping.include?(a)
    puts "No"
  else
    puts "Yes"
  end
else
  sleeping = ((b..23).to_a + (0..c).to_a)
  if sleeping.include?(a)
    puts "No"
  else
    puts "Yes"
  end
end

B は瞬殺だった。A を提出してから 4 分以内に提出していた。

x = gets.chomp.to_f

# x = '1.012'.chomp.to_f
# x = '12.340'.chomp.to_f
# x = '99.900'.chomp.to_f
# x = '0.000'.chomp.to_f

if x % 1.0 == 0
  puts x.to_i
else
  puts x
end

C は問題文の意味がわからなくて何したらいいかわからず何十分も右往左往した。数学記号っぽいのが出てくると途端に慄く。「数列の辞書順とは?」なんてヒントっぽい解説が書いてあったけど、読んでも全然意味がわからなかった。R1, R2, ..., Rn がなぜ与えられるのかすら理解できなかった。残り 10 分くらいでようやく意味がわかって、[[1, 2], [1], [1, 2, 3]] を求めるところまで辿り着き、これらの要素全ての組み合わせの中から和が k で割り切れるものだけ選べばいい、まで到達したが、product かな?と思いつつ検索せず自力で実装しようとしてタイムアップ。コンテスト終了後もしばらく足掻いた後、諦めて大人しく product を使ったら解けた。

n, k = gets.chomp.split(" ").map(&:to_i)
r = gets.chomp.split(" ").map(&:to_i)

# n, k = 3, 2
# r = [2, 1, 3]
# n, k = 1, 2
# r = [1]
# n, k = 5, 5
# r = [2, 3, 2, 3, 2]

x = []
1.upto(n) do |i|
  ri = r[i-1]
  x << (1..ri).to_a
end

x[0].product(*x[1..-1]).each do |y|
  if y.sum % k == 0
    puts y.join(' ')
  end
end

次の機会はちゃんとレーティングがつく状態で挑戦したい。