忍者ブログ

競プロ日記

競技プログラミングの問題を解いた感想を書きます。

[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

ABC030 D へんてこ辞書
半年ぶりの投稿。
上半期忙しい予定が1年中忙しくなりそう。

ここ2ヶ月くらいでHTMLとかCSSとかJavaScriptとかTypeScriptとかReactとかReduxとか使えるようになってChrome拡張をリリースしたりしてた。
このTwitter・ブログはあまりリアルとは紐付けたくないのでリリースしたものは秘密。
WEB系は初めて触るので色々苦労したけどさすがにWEB系全く触れませんはちょっと頂けないなと思ったよね。



今日は半年ぶりに競技プログラミングの問題を解いた。
もちろんC++。
JavaScript触ってるときはそもそも型という概念がなくてC++の静的型付けが恋しい。
TypeScript触ってるときはJavaScript本来の自由度の高いオブジェクトと相反する無駄に厳しい型付けからC++の適度な静的型付けが恋しい。
そんなことを思いながら勉強していたが、改めてC++触ったらやっぱり不満出るんだろうなぁ。
久々に触ったC++はそんな杞憂は吹き飛ばす書きやすさ・・・。

以下本編。


コード
https://atcoder.jp/contests/abc030/submissions/6923058


ABC030全部解いたうちのD問題。
A問題は"DRAW"と"DROW"を間違えて「は???」って何度もWA食らってた。
10^100000とかいう異常事態にどうしようかと為す術がなかった。
10^100000 ≒ 2^332192
BITSET<340000>とか使うのかな?なんて考えて素直にギブアップして解説をちょろっと見た。
なるほどmodは多倍長整数使わなくてもStringから1桁ずつ計算できるのか。
その部分でどうしようもなさすぎてその先はあまり考えていなかったが、ループ部分とループ外の最初の部分に分けて考えるのは思い付けてそう。

その後部分点があったのでとりあえずlong long型に入れてやってみると意外とすんなり部分点が取れたものの、Stringのmodを使うと今まで部分点取れてた部分の一部もWAになるのが非常に困った。

原因はこちら
while (kmod <= first) {
 kmod += loop;
}

最初ループにしておらず、例えばループ外が100、ループが2の場合なんかに、kmodに2を足してもまだループにたどり着かないなんてことが発生する。
たどり着くまで足してあげればいいのだが、少し特殊な実装になってしまったように思う。
私の実装では、ループ外とループ内の値を1つのインデックスで扱っていたが、ループ外とループ内のインデックスを分けてあげれば超えるまでループする作業はいらなさそう。
苦手意識の高いインデックスの0スタートと1スタートについて考えるのが面倒でこうなってしまった。
ここ2ヶ月くらいでWEB系勉強したと書いたが、アルゴリズムを実装しない限りインデックスの開始番号なんてほとんどの場合どちらでも良いので、単純に半年ぶりに苦手な部分を考え直して疲れた。

ちょっとAtCoderの色が役立ちそうな感があるので、また継続的にやっていきたいところ。
1日でD問題ある程度解けるくらいには理解力と実装力がまだあるみたいなのでちょっと安心。
これでB問題で「うぅ・・・」ってなったらどうしようかと思った。
PR

コメント

コメントを書く