【AtCoder-Ruby】ABC127 振返り
まず結果に関しては、以下の通り
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 は取れるな」との感触はあった。
今のペースで進めるが、新しい武器も揃えていこうと思う。
まあ、時間の制約もあるので焦らずに継続していこうと思う。