Atcoder Beginner Content 035 の問題をc++で解いてみた
Atcoder Beginner Contest 035 - 成長志向エンジニアの勉強日記
以前rubyで解いてみてD問題がTLEになってしまったので、C++を学んでチャレンジ。
競技プログラミング以外でもc++を勉強してみたかったので、英語の勉強もかねて、
The C++ Programming Language, 4th Editionを読みながら、A問題から実際に解いてみて、何を知ることが必要かを感じながらのチャレンジしてみた感じ。
The C++ Programming Languageは、かなり色々な歴史がありそうなc++で、現在どのように書くべきかを示してくれそうな感じでよさそう。
問題を解く上で必要になったc++の知識
- 標準入力、出力の処理
cin, cout で簡単に行える。
- 配列的なデータの扱い方
標準ライブラリのvectorで可変長の配列が簡単に扱える。
- デバッグ方法
rubyのp, ppやphpのprint_r, var_dumpのようなものが見つからず、一番苦労した点。
printデバッグ的なものは、下記のようにすれば、intやcharなどのシンプルなvectorは解りやすく表示できる。
template<typename T> void debug_vector (vector<T> v) { for (int i = 0, s = v.size(); i < s; i++) { cout << v[i]; if (i < s - 1) cout << "\t"; else cout << endl; } } template<typename T> void debug_2vector (vector< vector<T> > v) { for (int i = 0, s = v.size(); i < s; i++) { debug_vector(v[i]); cout << "\n"; } }
構造体や、構造体を含むvectorなどの複雑な変数の情報取得は、GDBを使うとできた。
構造体の出力は単純に、print [変数名] で出力できる。
vectorは、explore [変数名]でprintより抽象化された、上位の情報をが取得で、ちょっと解りづらい部分もあるが、各要素の情報が出力できる。
今後に向けての改善点
標準ライブラリにどういったものがあるか、実際にどうやって使うかをもっと知る
templateがどういったものかを知る
感想
D問題を無事通せたのでよかった。 templateや標準ライブラリを使いこなせれば、割と書きやすくなりそう。
追記 037も解いてみた
解法が解っているので、基本全てvectorを使って、debugは上記のdebug_vectorを使って特にストレスなく解けた。