ABC192感想戦
AtCoder Beginner Contest 192 に参加しました(SOMPO HD プログラミングコンテスト2021)。結果は、Eまで解けたものの、DでWAを出しまくりました。
Aは、100で割った余りを100から引けばOK。割り切れる場合は場合分けをしなくてもいい。1分。
Bは、奇数番目が小文字で、偶数番目が大文字、となっているかどうかをまじめにチェックする。ここまでで3分。
Cは、整数が与えられるので、「各桁の数を大きい方から順に並び替えた数」から「各桁の数を小さい方から順に並び替えた数」を引く操作を繰り返して、答えを求める問題。回数は多くないのでまじめに実装すればいいんだけど、わりとめんどくさい。
0から9までの各数字が何回出るかを数えて、「大きい順に並べた数」と「小さい順に並べた数」を作って計算していく。もっとうまいやり方はある気がするけど、とりあえず通すだけ通せた(提出 #20297140)。ここまでで12分。
D。XとMが与えられるので、Xをn進数の数とみなして得られる数を考えて、それらの中からM以下のものは何個あるか、という問題。
サンプルにあるX=22, M=10なら、3進数だと3*2+2=8なのでOK、4進数だと4*2+2=10なのでOK、5進数だと超える、だから2種類となる。n進数でOKならn-1進数でもOKなので、ギリギリを考えればいい。つまり、二分探索をすればいい。
オーバーフローを気にしなければ、愚直にやるだけなんだけど、オーバーフローを気にする場合はどうすればいいのかわからず。。。数が大きければスルーする、という方針で最初は書いてみたけど、WAが1回出たのでもうあきらめる(提出 #20309183)。ここまでで35分。
順位表を見ると、Eの方が解かれてる。ので、Eを見てみる。町と鉄道の情報が与えられていて、移動にかかる時間も与えられている。また、電車iはK_iの倍数の時刻でしか出発しない、という条件。
ほとんどダイクストラでOKで、K_iの倍数になるまで余分に時間がかかると思えばOK。ダイクストラをちょっといじってAC。今実行してみたら、after contestもちゃんと通ってた。ここまで47分。このムーブができたのがよかった。
Dに戻る。
まず、掛け算のまま考えると、オーバーフローのところで無限にバグりそうだったので、方針を変えて割り算にすることを考える。つまり、Xをn進数で見たときに、Mを超えてないかどうかを考えるときに、Mをn進数に変換してXと比較する方針で行く。例えば、Xが4桁の数だったら、Mをnで3回割ってその答えとXの一番上の位を比較する。Xが勝ってたらダメ、Mが勝ってたらOK、同点だったら次の桁を見る。これを繰り返していく。こうすれば、Mをnで割っていくので、オーバーフローは関係なくなる。
あと、1桁のときは、特別に考えないといけない。1桁のときは1だな、と考えた。
で、書いてみたら通らず(提出 #20324701)。ただ、WAの数は減った。で、また考える。
そういえば、1桁のとき、そもそもMのほうが小さいケースもあるのか。。。それはそう。ここも追加して提出したが通らず。その後も格闘したけど、二分探索の初期値を変えたらなぜか通った。今でもよくわかってない。。。テストケースが公開されたら見てみたい。ここまでで88分。
残り時間はないので、とりあえずFは見るだけ見て終了。Eを解いていなければ死んでた。
Dで格闘し続けてたら死んでたとこだった。
— なかけん88 (@nakaken88888888) February 20, 2021
nakaken88さんのSOMPO HD プログラミングコンテスト2021(AtCoder Beginner Contest 192)での成績:1076位
パフォーマンス:1528相当
レーティング:1473→1479 (+6) :)#AtCoder #SOMPOHDプログラミングコンテスト2021(ABC192) https://t.co/aDsBbWyCTo