kotazon.com

虎太郎の備忘録

【AtCoder-Ruby】ABC127 振返り

AtCoder Beginner Contest 127

まず結果に関しては、以下の通り

f:id:kharigai:20190526003057p:plain

A は普通の if 文で実装したが、一瞬三項演算子で一行にしょうかなとか迷った。
基本的にはスピード重視でそのまま提出した。

B は問題の読解に若干手間取った。

C は「ビット演算が早かろう」と思い書いたが、入力が大きい場合文字列操作で時間がかかる問題で沈没。
また、1 を並べるロジックをひねり出すのにも時間がかかったので、失敗後にリカバリーができなかった。。。

N, M = gets.strip.split.map(&:to_i)

s = ("1" * N).to_i(2)
M.times do 
  l, r = gets.strip.split.map(&:to_i)
  s = s & (("1" * (r - l + 1)) << ("0" * (l - 1))).to_i(2)
end
puts ("%0b" % s).count("1")

課題

A に関しては「後は問題を多く解けば早くなると思う」ので、引き続き日々回答を続ける。

B は読解に課題あり。
コンテスト本番では早く解こうと思うあまり、問題文を読むより例から取り掛かりがち。
緊張や焦りがあるのでイメージに起こして情報を整理すること!

C はそもそも取っ掛かりで間違っている。
コンテスト後程なくして「右の最小から左の最大を引く」ということに気がついた。。。
一応回答はこんな感じ。
一回目の回答では res > 0 の判定がなかったのでダメなパターンがあった。

N, M = gets.strip.split.map(&:to_i)

ls = []
rs = []
M.times { |i| ls[i], rs[i] = gets.strip.split.map(&:to_i) }

res = rs.min - ls.max + 1
puts res > 0 ? res : 0

考察

今回も「ABのみ」の結果ではあったが、「落ち着いてやれば C は取れるな」との感触はあった。
今のペースで進めるが、新しい武器も揃えていこうと思う。

まあ、時間の制約もあるので焦らずに継続していこうと思う。