WEB系エンジニアの勉強日記

Baby steps to Giant strides!

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++の知識

  • 標準入力、出力の処理

C++の標準入出力

cin, cout で簡単に行える。

  • 配列的なデータの扱い方

C++ 動的配列クラス std::vector 入門

標準ライブラリの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より抽象化された、上位の情報をが取得で、ちょっと解りづらい部分もあるが、各要素の情報が出力できる。

Data - Debugging with GDB

今後に向けての改善点

  • 標準ライブラリにどういったものがあるか、実際にどうやって使うかをもっと知る

  • templateがどういったものかを知る

感想

D問題を無事通せたのでよかった。 templateや標準ライブラリを使いこなせれば、割と書きやすくなりそう。

追記 037も解いてみた

解法が解っているので、基本全てvectorを使って、debugは上記のdebug_vectorを使って特にストレスなく解けた。