第1章 競技プログラミングとは?(p.7~) 第2章 AtCoderの始め方(p.43~) 第3章 競プロで必要な「アルゴリズムと思考力」(p.86~) スライドのまとめ(p.154~)
競技プログラミングことはじめ2022 年 11 月 22 日米田 優峻 [@E869120]1[完全版]
View Slide
162自己紹介 2米田 優峻 (よねだ まさたか)• 2002年生まれ• 2021年東京大学入学主な実績• 国際情報オリンピック ‘18, ‘19, ‘20 金メダル• 著書『アルゴリズム×数学』• 著書『競技プログラミングの鉄則』
162はじめに 3現在、競技プログラミング(競プロ)の人気が高まっています
162はじめに 4特に、国内最大級の競技プログラミングサイト AtCoder の参加登録数は 400,000 人を突破しています
162はじめに 5そこで本スライドでは、競技プログラミングとはどういうものか?AtCoder に登録する方法競プロで求められるスキルなどを紹介します!AtCoder で問題を解く方法
162目次 6第1章 競技プログラミングとは競技プログラミングとは/AtCoderについて/参加のメリット第2章 AtCoder の始め方AtCoder の登録方法/AtCoder で問題を解いてみよう第3章 競プロで必要な “アルゴリズムと思考力”競プロで必要なスキル/アルゴリズムの知識/数学的思考力・・・・・・・・・・・・ 7・・・・・・・・・・・・・・ 43・・・・ 86
第1 章競技プログラミングとは
1162-1競技プログラミングとは 8プログラミングの問題を解く競技競技プログラミングとは…
1162-1競技プログラミングとは 9基本的には、このような流れで競技が行われる参加者にいくつかの問題が与えられる問題A問題C問題B問題を解くプログラムを実装試験時間内に多く得点した方が上位213
1162-1競技プログラミングとは 10基本的には、このような流れで競技が行われる参加者にいくつかの問題が与えられる問題A問題C問題B問題を解くプログラムを実装試験時間内に多く得点した方が上位213
1162-1競技プログラミングとは 11基本的には、このような流れで競技が行われる参加者にいくつかの問題が与えられる問題A問題C問題B試験時間内に多く得点した方が上位213問題を解くプログラムを実装
1162-1競プロの問題 12Q. どんな問題が出されるか?
1162-1競プロの問題 13※ここで問題を解く必要はありません。どんな問題が出されるかのイメージをつかんだら、次のページに進んでかまいません。整数 𝑵, 𝑲 が与えられます。𝟏 以上 𝑵 以下の 3 つの整数を重複なしで選び、合計を 𝑲 にする方法は何通りですか?答えを出力するプログラムを作成してください。※ 𝑵, 𝑲 は 100 以下
1162-1競プロの問題 14N, K = map(int, input().split())Answer = 0for x in range(1, N+1):for y in range(x+1, N+1):z = N-x-yif y < z:Answer += 1print(Answer)プログラムを書く(基本的にどんな言語でもOK)正しい出力をするプログラムを提出すれば正解!※ここで問題を解く必要はありません。どんな問題が出されるかのイメージをつかんだら、次のページに進んでかまいません。整数 𝑵, 𝑲 が与えられます。𝟏 以上 𝑵 以下の 3 つの整数を重複なしで選び、合計を 𝑲 にする方法は何通りですか?答えを出力するプログラムを作成してください。※ 𝑵, 𝑲 は 100 以下
1162-1競プロの問題 15普通に解くと計算に時間がかかるため解法の工夫が要求される面白い問題もある※詳しくは 3 章で説明します
1162-1競プロの問題 16普通に解くと計算に時間がかかるため解法の工夫が要求される面白い問題もある※詳しくは 3 章で説明します競技プログラミングのイメージはつかめましたか?
1162-1コンテストの種類 17Q. どんなコンテストがあるのか?
1162-1GCJ年に一度の世界大会ICPC大学生向けのチーム戦情報オリンピック中高生向けの大会コンテストの種類 18AtCoder日本最大手のコンテスト世界には様々なコンテストがあります
1162-1GCJ年に一度の世界大会ICPC大学生向けのチーム戦情報オリンピック中高生向けの大会コンテストの種類 19AtCoder日本最大手のコンテスト次節では最大規模の AtCoder について紹介します毎週開催されるので初心者にもおすすめできる!
1.11.21.3AtCoder について競技プログラミングとはAtCoder のレーティング1.4 競プロに参加するメリット
1162-2AtCoder とは 21日本最大手のプログラミングコンテスト毎週土曜の 21 時からコンテストが開催される※日曜の同じ時間帯に開催されることもあります
1162-2AtCoder とは 22100 分で 8 問を解き、合計得点を競う※コンテストの約 3 分の 2 を占める AtCoder Beginner Contest の場合
1162-2AtCoder の特徴 23AtCoder の4 つの特徴
1162-2AtCoder の特徴 241 2 3 4参加費 場所 開催頻度 問題文AtCoder は無料運動系の大会は有料のものも多いが、AtCoder は基本的に無料で参加できる※※3 カ月に一度開催される「アルゴリズム実技検定」を受験する場合を除く
1162-2AtCoder の特徴 251 2 3 4参加費 場所 開催頻度 問題文オンライン開催自分の PC を持っていれば、ネット上でどこでも参加できる※3 カ月に一度開催される「アルゴリズム実技検定」を受験する場合を除く
1162-2AtCoder の特徴 261 2 3 4参加費 場所 開催頻度 問題文※3 カ月に一度開催される「アルゴリズム実技検定」を受験する場合を除く毎週開催される情報オリンピックなどと比べて開催頻度が高いので、定期的に実力を確認できる
1162-2AtCoder の特徴 271 2 3 4参加費 場所 開催頻度 問題文※3 カ月に一度開催される「アルゴリズム実技検定」を受験する場合を除く日本語の問題文がある海外のコンテストとは異なり、問題文が日本語で提供される。英語が読めない人でも安心
1162-2AtCoder の特徴 281 2 3 4参加費 場所 開催頻度 問題文※3 カ月に一度開催される「アルゴリズム実技検定」を受験する場合を除く日本語の問題文がある海外のコンテストとは異なり、問題文が日本語で提供される。英語が読めない人でも安心AtCoder は初心者でも参加しやすい!
1162-3AtCoder のレーティング 30AtCoder ではコンテストの成績に応じてレーティング が付けられる
1162-3AtCoder のレーティング 31コンテストの成績が良ければ増加しコンテストの成績が悪ければ減少する
1162-3AtCoder のレーティング 32また、レーティングに応じて色が付けられるたとえば、レーティングが 2800 以上であれば赤色になるオレンジ黄色青色水色緑色茶色灰色赤40080012001600200024002800
1162-3AtCoder のレーティング 33初心者は、まず茶色を目指しましょう!オレンジ黄色青色水色緑色茶色灰色赤40080012001600200024002800注意 茶色は下から 2 番目の色ですが、上位 40%なのでかなりすごいです。エンジニアで茶色になれない人も多いです。
1162-4競プロのメリット 35AtCoder などのコンテストに参加するメリットは何か?3 つ紹介します
1162-4競プロのメリット 361 2 3プログラミング力 思考力 楽しさ競プロの問題を解くには、当然プログラムを書く必要があるコンテストに参加していくとプログラムを書く能力が身につく!→
1162-4競プロのメリット 37詳しくは 3 章で説明するが、競プロの問題の中には思考力が要求されるものもある問題を解いていくうちに数学的思考力が身につく!→1 2 3プログラミング力 思考力 楽しさ
1162-4競プロのメリット 381 2 3プログラミング力 思考力 楽しささらに、プログラマにとって必須のアルゴリズムの知識も身につけることができる!
1162-4競プロのメリット 39AtCoder では同時に 5000 人以上の参加者と対戦できる(リアルタイムの順位表もある)ゲーム感覚で楽しんで参加できる!→1 2 3プログラミング力 思考力 楽しさ
1162-4競プロのメリット:結論 40このように、競技プログラミングでは…プログラムを書く能力アルゴリズムの知識数学的思考力・論理的思考力などを楽しんで身につけることができる!
1162-4競プロのメリット:結論 41このように、競技プログラミングでは…プログラムを書く能力アルゴリズムの知識数学的思考力・論理的思考力などを楽しんで身につけることができる!というわけで競技プログラミングに参加しましょう!
1162-4競プロのメリット:補足 42なお、競プロが就職・転職やコーディングテストに役立つ場合もある※※もちろん会社や業種によります。例:AtCoder 対応の就活サイト (https://jobs.atcoder.jp/)
第2 章AtCoder の始め方
2162-0第 2 章の内容 44第 2 章では、いよいよ AtCoder で競プロを始める方法を解説しますAtCoder で問題を解くには?AtCoder に登録するには?
2.12.22.3AtCoder で問題を解こうAtCoder の登録方法次の一歩へ2.4 コードテストについて
2162-1AtCoder の登録方法 46まず、https://atcoder.jp にアクセスしてください(AtCoder と検索すれば、一番上に出てくると思います)Step 1
2162-1AtCoder の登録方法 47下のような画面が出るので、新規登録ボタンを押してください(スマホの場合:画面右上のメニューバーを開いて新規登録を押す)Step 2
2162-1AtCoder の登録方法 48次に、登録フォームを埋めてください(ユーザー名・パスワードなどを入れる必要があります)Step 3
2162-1AtCoder の登録方法 49フォームを埋め終わったら、新規登録ボタンを押してくださいStep 4
2162-1AtCoder の登録方法 50これで登録完了!
2162-2AtCoder で問題を解こう 52それでは、早速 AtCoder のチュートリアル問題を1 問解いてみましょう!
2162-2AtCoder で問題を解こう 53Step 1 まず、https://atcoder.jp/contests/abs にアクセスします(AtCoder Beginners Selection と検索すると出てきます)
2162-2AtCoder で問題を解こう 54Step 2 すると、上のような画面が出るので参加登録ボタンを押します続いて、「問題」ボタンを押します
2162-2AtCoder で問題を解こう 55Step 3 問題一覧が出てくるので、とりあえず一番上の「PracticeA - Welcome To AtCoder」を開きます※ 1 問目の「Welcome to AtCoder」はチュートリアル用に作られた問題です
2162-2AtCoder で問題を解こう 56Step 4 これで、解きたい問題を開くことができました。
2162-2AtCoder で問題を解こう 57それでは、問題文の意味を確認していきましょう
2162-2AtCoder で問題を解こう 58本文 制約AtCoder の問題文は、本文・制約・入出力形式・例の4 つの部分に分かれています入出力形式 例整数 𝒂, 𝒃, 𝒄 と文字列 𝒔が与えられる。𝒂 + 𝒃 + 𝒄 の計算結果と文字列 𝒔 を並べて出力せよ。• 𝒂, 𝒃, 𝒄 は 𝟏 以上 𝟏𝟎𝟎以下の整数• 𝒔 は 𝟏𝟎𝟎 文字以下入力: 𝒂𝒃 𝒄𝒔出力: 𝒂 + 𝒃 + 𝒄 と 𝒔を空白区切りで出力入力: 12 3test出力: 6 test
2162-2AtCoder で問題を解こう 59本文では、どのような問題を解けばよいのかが説明されています制約 入出力形式 例• 𝒂, 𝒃, 𝒄 は 𝟏 以上 𝟏𝟎𝟎以下の整数• 𝒔 は 𝟏𝟎𝟎 文字以下入力: 𝒂𝒃 𝒄𝒔出力: 𝒂 + 𝒃 + 𝒄 と 𝒔を空白区切りで出力入力: 12 3test出力:本文整数 𝒂, 𝒃, 𝒄 と文字列 𝒔が与えられる。𝒂 + 𝒃 + 𝒄 の計算結果と文字列 𝒔 を並べて出力せよ。6 test
2162-2AtCoder で問題を解こう 60制約では、入力としてどのようなデータが与えられるかが記されています本文 入出力形式 例整数 𝒂, 𝒃, 𝒄 と文字列 𝒔が与えられる。𝒂 + 𝒃 + 𝒄 の計算結果と文字列 𝒔 を並べて出力せよ。入力: 𝒂𝒃 𝒄𝒔出力: 𝒂 + 𝒃 + 𝒄 と 𝒔を空白区切りで出力入力: 12 3test出力:制約• 𝒂, 𝒃, 𝒄 は 𝟏 以上 𝟏𝟎𝟎以下の整数• 𝒔 は 𝟏𝟎𝟎 文字以下6 testつまり、𝒂 = 𝟏𝟎𝟏 のようなデータが与えられることはないと思ってよい!※2 章では制約をあまり気にしなくても良いですが、3 章では重要になります。
2162-2AtCoder で問題を解こう 61入出力形式では、どういうフォーマットで入力・出力を行えば良いかが記されています本文 入出力形式 例整数 𝒂, 𝒃, 𝒄 と文字列 𝒔が与えられる。𝒂 + 𝒃 + 𝒄 の計算結果と文字列 𝒔 を並べて出力せよ。入力: 𝒂𝒃 𝒄𝒔出力: 𝒂 + 𝒃 + 𝒄 と 𝒔を空白区切りで出力入力: 12 3test出力:制約• 𝒂, 𝒃, 𝒄 は 𝟏 以上 𝟏𝟎𝟎以下の整数• 𝒔 は 𝟏𝟎𝟎 文字以下※フォーマットに従わなければ不正解となる場合がありますので、注意してくださいたとえばこの問題では、入力として• 1 行目に 𝒂 が与えられる• 2 行目に 𝒃, 𝒄 が空白区切りで与えられる• 3 行目に 𝒔 が与えられる6 test
2162-2AtCoder で問題を解こう 62本文 制約例では、「どういう入力であればどういう出力が正しいか」の具体例が示されています入出力形式 例整数 𝒂, 𝒃, 𝒄 と文字列 𝒔が与えられる。𝒂 + 𝒃 + 𝒄 の計算結果と文字列 𝒔 を並べて出力せよ。• 𝒂, 𝒃, 𝒄 は 𝟏 以上 𝟏𝟎𝟎以下の整数• 𝒔 は 𝟏𝟎𝟎 文字以下入力: 𝒂𝒃 𝒄𝒔出力: 𝒂 + 𝒃 + 𝒄 と 𝒔を空白区切りで出力入力: 12 3test出力: 6 test
2162-2AtCoder で問題を解こう 63問題文は理解できましたか?それでは実際に解いてみましょう
2162-2AtCoder で問題を解こう 64Step 4 問題を解くプログラムを実装します例:C++/Python の場合、以下のコードを書けば良いです#include #include using namespace std;int main() {int a, b, c; string s;cin >> a >> b >> c >> s;cout << a+b+c << “ “ << s << endl;return 0;}C++# 入力a = int(input())b, c = map(int, input().split())S = input()# 出力print(str(a+b+c) + “ “ + s)Python
2162-2AtCoder で問題を解こう 65Step 5 実装ができたら、問題文下部の提出欄にソースコードを貼り付け提出ボタンを押しましょう
2162-2AtCoder で問題を解こう 66Step 6 すると、上のような提出画面が表示されます最初は WJ ですが、自動で採点されて約 10 秒で AC に変わります
2162-2AtCoder で問題を解こう 67「AC」と出れば正解ですおめでとうございます!!!
2162-2判定について 68# 入力a = int(input())b, c = map(int, input().split())S = input()# 出力print(str(a*b*c) + “ “ + s)WAなお、不正解であれば「WA」という判定が出る(たとえば、a+b+c の代わりに a*b*c を出力するプログラムを提出すると WA)
2162-2判定について 69そのほかにも、上の表に示すような判定がある正解不正解(1 つ以上のケースで間違った出力をしている)実行時間制限超過(詳しくは 3 章で説明します)実行時エラー(0 割りなど)コンパイルエラー採点中ACWATLERECEWJ
2162-3次のステップへ 71それでは、チュートリアル問題の次はどうすれば良いのか?
2162-3チュートリアル問題の次は? 72Step 1 プログラミングの基本文法に慣れていない人はC++ 入門用教材 APG4B を解く※URL:https://atcoder.jp/contests/APG4b
2162-3チュートリアル問題の次は? 73Step 2 AtCoder Beginners Selections を解いて競プロの問題のイメージをつかむ※URL:https://atcoder.jp/contests/abs
2162-3チュートリアル問題の次は? 74Step 3 これでコンテストに出る準備は万端!コンテストに出場しよう!213
2162-3コンテストについて 75コンテストに関する注意
2162-3コンテストについて 76AtCoder には 4 種類のコンテストがありますが…初心者には ABC がオススメ!注意1AtCoder Beginner Contest (ABC)AtCoder Regular Contest (ARC)AtCoder Grand Contest (AGC)AtCoder Heuristic Contest (AHC)
2162-3コンテストについて 77ただし、ABC は Beginner Contest という名前ですがそれほど簡単ではないことに注意!注意2初心者は 8 問中 2 問解ければ十分です※※筆者(2022/11/21 時点で国内ランキング18位)でも全問正解できないことの方が多いです。※ ARC や AGC はさらに難しいです。簡単だと思って参加したら解けなくて挫折する人が多いですBeginner Contest という名前が問題だと思うのですが…
2162-3コードテストについて 79最後に、AtCoder 上でプログラムを実行できる便利な機能コードテストの使い方を紹介します
2162-3コードテストについて 80Step 1まず、コンテストページ右上のコードテストをクリックします※上の画像は、2.2 節で扱った AtCoder Beginners Selection の場合の例となっています。
2162-3コードテストについて 81Step 2すると、このような画面が出てくるので、ソースコードと入力を書きますここにソースコードを書くここに入力を書く
2162-3コードテストについて 82Step 3それが終わったら、実行ボタンを押します※右図のソースコードは、2 つの整数 𝒂, 𝒃を入力し、𝒂 + 𝒃 を出力するものです
2162-3コードテストについて 83Step 4数秒待つと、画面下部に実行結果が出力されます※たしかに正しい値 123+456=579 が出力されているのがわかります
2162-3コードテストについて 84Step 4数秒待つと、画面下部に実行結果が出力されます※たしかに正しい値 123+456=579 が出力されているのがわかりますコードテストの使い方はわかりましたか?
2162-3コードテストについて 85コードテストを使えば、手元に実行環境がなくてもWeb 上でプログラムを実装できます必要な人はぜひ活用しましょう!
第3 章アルゴリズムと思考力
3162-1ここまでの振り返り 87第 1 章・第 2 章では、競技プログラミングとは何か?AtCoder とは何か?AtCoder で問題を解く方法は?などを解説しました
3162-1新たな疑問 88それでは、競プロではどういうスキルが求められるのか?
3162-1競プロの流れ(再掲) 89まず競プロでは、プログラムを実装する必要があります参加者にいくつかの問題が与えられる問題A問題C問題B試験時間内に多く得点した方が上位213問題を解くプログラムを実装
3162-1競プロの流れ(再掲) 90そのため、「プログラムを書く能力」が当然求められます参加者にいくつかの問題が与えられる問題A問題C問題B問題を解くプログラムを実装試験時間内に多く得点した方が上位213
3162-1競プロで必要なスキル 91しかし、プログラミング能力だけで十分なのでしょうか?
3162-1競プロで必要なスキル 92競プロの難しい問題を解くためには「アルゴリズム」と「数学的思考力」も重要になります数学的思考力アルゴリズムの知識?※「アルゴリズム」という言葉の意味は、p.XXX で説明されています
3162-1• 3.2 節/3.3 節では、アルゴリズムの知識や数学的思考力がどういう問題で活躍するのかを紹介します• 皆さん、ぜひ楽しんでお読みください!第 3 章の内容 93※難しかったら読み飛ばしても構いません。
3.13.23.3アルゴリズムの知識競プロで求められるスキル数学的思考力
3162-2アルゴリズムが重要となる例 95まずは迷路の問題を考えてみましょう
3162-2迷路の問題 961 手で上下左右に隣り合うマスに移動できるスタートからゴールへ最短何手で移動できるか?ゴールSGスタート※ただし、迷路の大きさは 50×50 まで。
3162-2迷路の問題 97たとえば、全部の経路を調べれば答えを求めることができる
3162-2迷路の問題:全探索 98ところが、スタート地点から出発する経路はたくさんある!
3162-2迷路の問題:全探索 99ところが、スタート地点から出発する経路はたくさんある!約150,000 通り
3162-2迷路の問題:全探索 100さらに迷路が大きくなると…
3162-2迷路の問題:全探索 101>15万通り
3162-2迷路の問題:全探索 102>1400万通り>15万通り
3162-2迷路の問題:全探索 103>1400万通り>380億通り>15万通り
3162-2迷路の問題:全探索 104>380億通り実は、コンピュータの演算速度は毎秒 1 億回程度つまり単純に割り算しても5 分以上かかることに!※実行環境やプログラミング言語によって変わりますが、AtCoder 上で Python を動かした場合、毎秒 1 億回程度になります
3162-2迷路の問題:全探索 105>380億通りコンピュータの演算速度は毎秒 1 億回程度つまり単純に割り算しても5 分以上かかることに!※実行環境やプログラミング言語によって変わりますが、AtCoder 上で Python を動かした場合、毎秒 1 億回程度になりますそして競プロの問題では、数秒以内で実行が終わらなければ不正解となってしまう!
3162-2迷路の問題:解法の工夫 106そこで、解法を工夫するととても簡単に答えを求めることができる
3162-2迷路の問題:解法の工夫 1070 スタートに 0 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 108010 の隣に 1 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 10901 21 の隣に 2 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 11001 2 32 の隣に 3 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1110 41 2 343 の隣に 4 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1120 4 51 2 3454 の隣に 5 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1130 4 5 61 2 346 55 の隣に 6 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1140 4 5 61 2 3 747 6 56 の隣に 7 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1150 4 5 61 2 3 74 87 6 587 の隣に 8 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1160 4 5 61 2 3 74 8 97 6 5 9898 の隣に 9 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1170 4 5 61 2 3 74 8 9 107 6 5 9 108 109109 の隣に 10 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1180 4 5 61 2 3 7 114 8 9 107 6 5 9 108 11 109 1110 111110 の隣に 11 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1190 4 5 6 121 2 3 7 114 8 9 107 6 5 9 108 11 109 12 11 1210 11 1211 121211 の隣に 12 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1200 4 5 6 12 131 2 3 7 114 8 9 107 6 5 9 108 11 109 13 12 11 12 1310 11 12 1311 12 1312 1312 の隣に 13 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1210 4 5 6 12 13 141 2 3 7 114 8 9 107 6 5 9 108 11 10 149 13 12 11 12 1310 11 12 1311 12 1312 13 1413 の隣に 14 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1220 4 5 6 12 13 141 2 3 7 11 154 8 9 107 6 5 9 108 11 10 14 159 13 12 11 12 1310 11 12 1311 12 1312 13 14 1514 の隣に 15 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1230 4 5 6 12 13 141 2 3 7 11 154 8 9 10 167 6 5 9 10 168 11 10 14 15 169 13 12 11 12 1310 11 12 1311 12 1312 13 14 15 1615 の隣に 16 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1240 4 5 6 12 13 141 2 3 7 11 154 8 9 10 167 6 5 9 10 16 178 11 10 14 15 169 13 12 11 12 13 1710 11 12 1311 12 13 1712 13 14 15 1616 の隣に 17 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1250 4 5 6 12 13 141 2 3 7 11 154 8 9 10 167 6 5 9 10 16 178 11 10 14 15 169 13 12 11 12 13 1710 11 12 13 1811 12 13 17 1812 13 14 15 1617 の隣に 18 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1260 4 5 6 12 13 141 2 3 7 11 154 8 9 10 167 6 5 9 10 16 178 11 10 14 15 169 13 12 11 12 13 1710 11 12 13 19 1811 12 13 17 18 19 1912 13 14 15 1618 の隣に 19 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1270 4 5 6 12 13 141 2 3 7 11 154 8 9 10 167 6 5 9 10 16 178 11 10 14 15 169 13 12 11 12 13 1710 11 12 13 19 1811 12 13 17 18 19 20 1912 13 14 15 16 20 2019 の隣に 20 を書く※書かれた数は、スタートからの最短手数を意味します。
3162-2迷路の問題:解法の工夫 1280 4 5 6 12 13 141 2 3 7 11 154 8 9 10 167 6 5 9 10 16 178 11 10 14 15 169 13 12 11 12 13 1710 11 12 13 19 1811 12 13 17 18 19 20 1912 13 14 15 16 20 2019 の隣に 20 を書く※書かれた数は、スタートからの最短手数を意味します。ゴールまでの最短手数は 20 手!
3162-2迷路の問題:解法の工夫 1290 4 5 6 12 13 141 2 3 7 11 154 8 9 10 167 6 5 9 10 16 178 11 10 14 15 169 13 12 11 12 13 1710 11 12 13 19 1811 12 13 17 18 19 20 1912 13 14 15 16 20 2019 の隣に 20 を書く※書かれた数は、スタートからの最短手数を意味します。ゴールまでの最短手数は 20 手!この方法であればコンピュータで 0.01 秒!
3162-2迷路の問題:補足 1300 4 5 6 12 13 141 2 3 7 11 154 8 9 10 167 6 5 9 10 16 178 11 10 14 15 169 13 12 11 12 13 1710 11 12 13 19 1811 12 13 17 18 19 20 1912 13 14 15 16 20 20なお、ゴール地点から始めて 20→19→18→17→… と数字が小さくなる方向に動くと、具体的な最短経路がわかる※書かれた数は、スタートからの最短手数を意味します。
3162-2解法を思いつくために 131さて、一体どうすればこんな解法が思いつけるのか?
3162-2解法を思いつくために 132以下のような「典型的なアルゴリズム」を知っているだけで結構変わる!累積和二分探索動的計画法深さ優先探索幅優先探索ダイクストラ法素数判定法ユークリッドの互除法繰り返し二乗法
3162-2解法を思いつくために 133たとえば迷路の場合は「幅優先探索」を知っていれば思いつける累積和二分探索動的計画法深さ優先探索幅優先探索ダイクストラ法素数判定法ユークリッドの互除法繰り返し二乗法
3162-2補足 134補足:アルゴリズムとは?
3162-2• 問題を解く手順(解法)のことを、プログラミングの文脈ではアルゴリズムという• 基本的には、計算の速く終わる方が「良いアルゴリズム」• たとえば迷路の問題の場合、経路を全部調べるアルゴリズムより、隣に数を書いていくアルゴリズムの方が、良いといえる補足:アルゴリズムとは? 135※なお、特に競プロ以外の文脈では、良いアルゴリズムの指標として、計算時間だけでなくメモリ使用量などが使われることもあります
3162-3数学的思考が重要になる例 137まず、コマを移動させる問題を考えてみましょう
3162-3ピッタリ移動する問題 138• 5 個のマスが一列に並んだマス目がある• 隣り合うマスへの移動をちょうど 𝑵 回行うことで、左端から右端に移動することはできるか?5 個ゴールスタート※制約:𝑵 は 1 以上 100 以下 (入力は 𝑵 のみ)
3162-3ピッタリ移動する問題 139例:𝑵 = 𝟑 の場合1 2 3No…そもそもたどり着かない…
3162-3ピッタリ移動する問題 1401 2 34 56よし、行けた!例:𝑵 = 𝟔 の場合 Yes!
3162-3ピッタリ移動する問題 1411 2 3541 回余ってしまう…例:𝑵 = 𝟓 の場合 No…
3162-3ピッタリ移動する問題:全探索 142それでは、どうやって解けば良いか?
3162-3ピッタリ移動する問題:全探索 143まず、あり得る経路を全部調べれば、答えがわかる(例:𝑵 = 𝟓 の場合、上の 9 通りが全部ダメなので答えは No)
3162-3ピッタリ移動する問題:全探索 144まず、あり得る経路を全部調べれば、答えがわかる(例:𝑵 = 𝟓 の場合、上の 9 通りが全部ダメなので答えは No)約5,600億 通りしかし、𝑵 = 𝟓𝟎 になるとコンピュータでも無理!
3162-3ピッタリ移動する問題:全探索 145まず、あり得る経路を全部調べれば、答えがわかる(例:𝑵 = 𝟓 の場合、上の 9 通りが全部ダメなので答えは No)約5,600億 通りしかし、𝑵 = 𝟓𝟎 になるとコンピュータでも無理!そこで、「偶奇で場合分けする」という数学的思考をすると簡単に解ける!
3162-3工夫した解法 146まず、𝑵 が偶数の場合 𝑵 = 𝟐 の場合は、手数的に無理だが𝑵 ≥ 𝟒 の場合は、ゴールまで一直線に進んだ後、ゴール付近を往復すれば良いので Yes
3162-3工夫した解法 147まず、𝑵 が偶数の場合 𝑵 = 𝟐 の場合は、手数的に無理だが𝑵 ≥ 𝟒 の場合は、ゴールまで一直線に進んだ後、ゴール付近を往復すれば良いので Yes𝑵 = 𝟒 のとき 𝑵 = 𝟔 のとき 𝑵 = 𝟖 のとき
3162-3工夫した解法 148一方、𝑵 が奇数の場合 左から 1・3・5 マス目を青、2・4 マス目を白で塗ると…
3162-3工夫した解法 149一方、𝑵 が奇数の場合 左から 1・3・5 マス目を青、2・4 マス目を白で塗ると…青 白 青白青白青白 青白白 青青 白白白青青必ず「青→白→青→白→…」という順番で移動𝑵 が奇数のときは白色で終わる
3162-3工夫した解法 150一方、𝑵 が奇数の場合 左から 1・3・5 マス目を青、2・4 マス目を白で塗ると…白白白必ず「青→白→青→白→…」という順番で移動𝑵 が奇数のときは白色で終わるたしかに 𝑵 = 𝟓 のときは全部白色で終わっている
3162-3工夫した解法 151一方、𝑵 が奇数の場合 左から 1・3・5 マス目を青、2・4 マス目を白で塗ると…白白白必ず「青→白→青→白→…」という順番で移動𝑵 が奇数のときは白色で終わるたしかに 𝑵 = 𝟓 のときは全部白色で終わっているところが、ゴールのマスは青色である𝑵 が奇数のときは、答えは No
3162-3工夫した解法 152このように、偶奇で場合分けして考えると、簡単に答えがわかる𝑵 が偶数の場合𝑵 が奇数の場合𝑵 = 𝟐 でなければ Yes絶対に No
3162-3工夫した解法 153競技プログラミングでは、今回のように数学的思考力が必要な問題が出ることもある!
スライドのまとめ
4162• 競技プログラミングは、プログラミングの問題を速く正確に解く競技であり、略して競プロと呼ばれることもある• 世界では様々な競プロの大会がある• AtCoder、情報オリンピック、ICPC、Google Code Jam など• 第 2 章では、AtCoder の使い方を中心に説明したスライドのまとめ 155
4162スライドのまとめ 156もちろん競プロでは、速くプログラムを書く能力も重要
4162スライドのまとめ 157しかし競プロでは、数秒以内に実行が終わる効率的なプログラムが求められる!
4162スライドのまとめ 158したがって、より良い解法を考えるためのアルゴリズムの知識と数学的思考力も同じくらい重要!?(そして、解法を考える部分が一番面白い!)
4162スライドのまとめ 159さて、アルゴリズムと思考力を身につけるには?
4162本の紹介 160競技プログラミングの鉄則2022年9月発売/筆者が執筆フルカラーの図が豊富で分かりやすい!AtCoder 自動採点システム付きの演習問題!C++/Python/Java に対応!特徴123興味のある方はぜひお読みください!※なお、本の紙面には C++ しか載っていませんが、サポートページには Python/Java のプログラムがすべて載っています発売2カ月で4刷
41621. 米田優峻:『競技プログラミングの鉄則』(マイナビ出版、2022)2. 米田優峻:『「アルゴリズム×数学」が基礎からしっかり身につく本』(技術評論社、2021)3. 大槻兼資:『プログラミングコンテストAtCoder入門』(KADOKAWA、2022)4. 米田優峻:『レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【初級編:競プロを始めよう】』(Qiita で公開)5. 大槻兼資:『AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~』(Qiita で公開)6. テレ東BIZ:未経験者のアナタもハマる?競技プログラミング「AtCoder」って何だ?【橋本幸治の理系通信】7. https://atcoder.jp/参考文献 161
最後までスライドをお読みいただきありがとうございました