0.はじめに
GW期間を経て久々のコンテスト。ゼルダをしてたらいつの間にか開始時間に
なっていて慌ててスタート。D問題に苦戦していて時間ギリギリまで
粘っていたら、会社から電話があってトラブル対応に・・・。
バタバタしているうちに終わり3問正解で終了。
レートは微増で終わりました。
1.A - Overall Winner
TとAの数が同じ場合の解決法として、最後の勝利者でない方を
総合勝者とすることで実装しました。
https://atcoder.jp/contests/abc301/submissions/41352697
2.B - Fill the Gaps
リストを先頭から見ていき、前の数字との差が2以上空いていたら
間を埋める数字を入れていくという形で実装しました。
https://atcoder.jp/contests/abc301/submissions/41358622
3.C - AtCoder Cards
考え方としては、いかさまをすればカードの並び順は関係ないので
単純にSとT内でアルファベット毎に出現数を比較し
・出現数に差異がある文字がa, t, c, o, d, e, r以外ならNo
・上記以外の差異数=置き換えなければいけない文字数が@の数より多ければNo
・上記以外ならYes
といった考えで実装しAC。
https://atcoder.jp/contests/abc301/submissions/41372054
4.D - Bitmask
コンテスト中はSとNをそれぞれ二進法で管理して
桁をそろえ頭から比較していきNよりSを小さくするように
調整していくと言った感じで実装をしていきました。
結局、考慮の穴等も多く穴埋めてる間に時間が無くなってしまいました。
コンテスト後に解説を見て根本のとこで勘違い(なぜか文字列Sを後ろから
切り取ってよいと思っていました・・・)していたので
素直に解説通りに実装しました。
実装
1)文字列Sを数値SNに変換。その際"?"は”0”とし、とりうる最小値を
求める。(解説を見てreversedという書き方を知りました。)
for i in reversed(range(SL)):
if(S[SL-i-1]=="1"):
SN+=1<<i
2)SNがNより大きかったら-1を表示
3)上記以外の時はSを先頭から見ていき
?を1に変えた場合のSNがNを超えなければ
変えていく。
for i in reversed(range(SL)):
if(S[SL-i-1]=="?"):
if(SN+(1<<i)<=N):
SN+=1<<i
4)3)の結果を表示して終了
https://atcoder.jp/contests/abc301/submissions/41402835
以上