競技プログラミングとは
決められた条件のもとで与えられた問題、課題をプログラミングを用いて解決し、その過程や結果を競うものを競技プログラミングといいます。
様々なジャンルの出題がされますが、プログラミングや思考力、数学力、知識を活用します。
そのうち、アルゴリズムやヒューリスティックというジャンルについてはAtCoderやCodeforces等で定期的にコンテストが開かれており、その結果によってレーティングと呼ばれる実力指数が変化します。 AtCoderでのレーティングとは
コンテストの開始時間に問題が一斉に公開されます。それまでに出されたことのない問題が出題され、どのように解決するかが問われます。
競技プログラミングの目的
AtCoderは、競技プログラミングを通じて、数理的および情報的な問題を解決する楽しさを提供しています。
これはネットゲームのような競技性と娯楽性を持ち合わせていますが、同時に、プログラミングスキル、論理的思考、問題解決能力の向上にも大いに役立ちますので、興味を持ってくれた方もぜひ楽しんで問題を解いてくれればと思います。
出題される問題
様々なジャンルの問題が出題されます。
アルゴリズムの知識を活用したり、最適解の存在しない問題に対して高い精度の解を出すヒューリスティック、与えられたデータセットから機械学習のモデルを作成するものや、与えられたwebサーバを可能な限り高速化する、などです。
AtCoderでは、アルゴリズムに関する問題と、ヒューリスティックの問題を出題しています。
たとえば、アルゴリズム分野では、以下のようなもの:
- if, forが出来れば解けるもの
- 数学的な工夫が必要なもの
- 実装が重く複雑なもの
- 高度なアルゴリズム知識をさらに発展させる必要のあるもの
ヒューリスティック分野では、以下のようなもの:
- 巨大なケーキにのったイチゴを良い感じに参加者に分配する( AHC #12 )
- とても広い地図での最短経路を計算する( AHC #3 )
- とても広いマップに長方形をできるだけたくさんつめる( AHC #1 )
さらなる具体例
以下のような問題があります。(practice contest Aより)
この問題を解くプログラムは、C++で書くと次のようになります。
ジャッジに提出すると、制約の範囲内で様々な入力が与えられます。この1テストケースごとにプログラムが実行され、出力結果が正しいか判定されます。
用意されたすべてのテストケースに正解すると、その問題に正解します(これをACといいます)。一部またはすべてが間違っている時は、不正解です(これをWAといいます)。
AtCoderでは、低難易度から高難易度まで、様々なジャンルの問題が出題されています。