$30 off During Our Annual Pro Sale. View details »

競技プログラミングことはじめ

E869120
November 22, 2022

 競技プログラミングことはじめ

第1章 競技プログラミングとは?(p.7~)
第2章 AtCoderの始め方(p.43~)
第3章 競プロで必要な「アルゴリズムと思考力」(p.86~)
スライドのまとめ(p.154~)

E869120

November 22, 2022
Tweet

More Decks by E869120

Other Decks in Programming

Transcript

  1. 競技プログラミングことはじめ 2022 年 11 月 22 日 米田 優峻 [@E869120]

    1 [完全版]
  2. 162 自己紹介 2 米田 優峻 (よねだ まさたか) • 2002年生まれ •

    2021年東京大学入学 主な実績 • 国際情報オリンピック ‘18, ‘19, ‘20 金メダル • 著書『アルゴリズム×数学』 • 著書『競技プログラミングの鉄則』
  3. 162 はじめに 3 現在、競技プログラミング(競プロ)の 人気が高まっています

  4. 162 はじめに 4 特に、国内最大級の競技プログラミングサイト AtCoder の 参加登録数は 400,000 人を突破しています

  5. 162 はじめに 5 そこで本スライドでは、 競技プログラミングとはどういうものか? AtCoder に登録する方法 競プロで求められるスキル などを紹介します! AtCoder

    で問題を解く方法
  6. 162 目次 6 第1章 競技プログラミングとは 競技プログラミングとは/AtCoderについて/参加のメリット 第2章 AtCoder の始め方 AtCoder

    の登録方法/AtCoder で問題を解いてみよう 第3章 競プロで必要な “アルゴリズムと思考力” 競プロで必要なスキル/アルゴリズムの知識/数学的思考力 ・・・・・・・・・・・・ 7 ・・・・・・・・・・・・・・ 43 ・・・・ 86
  7. 第 1 章 競技プログラミングとは

  8. 1 162 -1 競技プログラミングとは 8 プログラミングの問題を解く競技 競技プログラミングとは…

  9. 1 162 -1 競技プログラミングとは 9 基本的には、このような流れで競技が行われる 参加者にいくつかの 問題が与えられる 問題 A

    問題 C 問題 B 問題を解く プログラムを実装 試験時間内に 多く得点した方が上位 2 1 3
  10. 1 162 -1 競技プログラミングとは 10 基本的には、このような流れで競技が行われる 参加者にいくつかの 問題が与えられる 問題 A

    問題 C 問題 B 問題を解く プログラムを実装 試験時間内に 多く得点した方が上位 2 1 3
  11. 1 162 -1 競技プログラミングとは 11 基本的には、このような流れで競技が行われる 参加者にいくつかの 問題が与えられる 問題 A

    問題 C 問題 B 試験時間内に 多く得点した方が上位 2 1 3 問題を解く プログラムを実装
  12. 1 162 -1 競プロの問題 12 Q. どんな問題が出されるか?

  13. 1 162 -1 競プロの問題 13 ※ここで問題を解く必要はありません。どんな問題が出されるかのイメージをつかんだら、次のページに進んでかまいません。 整数 𝑵, 𝑲 が与えられます。

    𝟏 以上 𝑵 以下の 3 つの整数を重複 なしで選び、合計を 𝑲 にする方法 は何通りですか? 答えを出力するプログラムを作成 してください。 ※ 𝑵, 𝑲 は 100 以下
  14. 1 162 -1 競プロの問題 14 N, K = map(int, input().split())

    Answer = 0 for x in range(1, N+1): for y in range(x+1, N+1): z = N-x-y if y < z: Answer += 1 print(Answer) プログラムを書く (基本的にどんな言語でもOK) 正しい出力をする プログラムを提出すれば正解! ※ここで問題を解く必要はありません。どんな問題が出されるかのイメージをつかんだら、次のページに進んでかまいません。 整数 𝑵, 𝑲 が与えられます。 𝟏 以上 𝑵 以下の 3 つの整数を重複 なしで選び、合計を 𝑲 にする方法 は何通りですか? 答えを出力するプログラムを作成 してください。 ※ 𝑵, 𝑲 は 100 以下
  15. 1 162 -1 競プロの問題 15 普通に解くと計算に時間がかかるため 解法の工夫が要求される 面白い問題もある ※詳しくは 3

    章で説明します
  16. 1 162 -1 競プロの問題 16 普通に解くと計算に時間がかかるため 解法の工夫が要求される 面白い問題もある ※詳しくは 3

    章で説明します 競技プログラミングのイメージは つかめましたか?
  17. 1 162 -1 コンテストの種類 17 Q. どんなコンテストがあるのか?

  18. 1 162 -1 GCJ 年に一度の世界大会 ICPC 大学生向けのチーム戦 情報オリンピック 中高生向けの大会 コンテストの種類

    18 AtCoder 日本最大手のコンテスト 世界には様々なコンテストがあります
  19. 1 162 -1 GCJ 年に一度の世界大会 ICPC 大学生向けのチーム戦 情報オリンピック 中高生向けの大会 コンテストの種類

    19 AtCoder 日本最大手のコンテスト 次節では最大規模の AtCoder について紹介します 毎週開催されるので 初心者にもおすすめできる!
  20. 1.1 1.2 1.3 AtCoder について 競技プログラミングとは AtCoder のレーティング 1.4 競プロに参加するメリット

  21. 1 162 -2 AtCoder とは 21 日本最大手のプログラミングコンテスト 毎週土曜の 21 時からコンテストが開催される

    ※日曜の同じ時間帯に開催されることもあります
  22. 1 162 -2 AtCoder とは 22 100 分で 8 問を解き、合計得点を競う

    ※コンテストの約 3 分の 2 を占める AtCoder Beginner Contest の場合
  23. 1 162 -2 AtCoder の特徴 23 AtCoder の 4 つの特徴

  24. 1 162 -2 AtCoder の特徴 24 1 2 3 4

    参加費 場所 開催頻度 問題文 AtCoder は無料 運動系の大会は有料のものも多い が、AtCoder は基本的に無料で 参加できる※ ※3 カ月に一度開催される「アルゴリズム実技検定」を受験する場合を除く
  25. 1 162 -2 AtCoder の特徴 25 1 2 3 4

    参加費 場所 開催頻度 問題文 オンライン開催 自分の PC を持っていれば、ネッ ト上でどこでも参加できる ※3 カ月に一度開催される「アルゴリズム実技検定」を受験する場合を除く
  26. 1 162 -2 AtCoder の特徴 26 1 2 3 4

    参加費 場所 開催頻度 問題文 ※3 カ月に一度開催される「アルゴリズム実技検定」を受験する場合を除く 毎週開催される 情報オリンピックなどと比べて開 催頻度が高いので、定期的に実力 を確認できる
  27. 1 162 -2 AtCoder の特徴 27 1 2 3 4

    参加費 場所 開催頻度 問題文 ※3 カ月に一度開催される「アルゴリズム実技検定」を受験する場合を除く 日本語の問題文がある 海外のコンテストとは異なり、問 題文が日本語で提供される。英語 が読めない人でも安心
  28. 1 162 -2 AtCoder の特徴 28 1 2 3 4

    参加費 場所 開催頻度 問題文 ※3 カ月に一度開催される「アルゴリズム実技検定」を受験する場合を除く 日本語の問題文がある 海外のコンテストとは異なり、問 題文が日本語で提供される。英語 が読めない人でも安心 AtCoder は初心者でも 参加しやすい!
  29. 1.1 1.2 1.3 AtCoder について 競技プログラミングとは AtCoder のレーティング 1.4 競プロに参加するメリット

  30. 1 162 -3 AtCoder のレーティング 30 AtCoder ではコンテストの成績に応じて レーティング が付けられる

  31. 1 162 -3 AtCoder のレーティング 31 コンテストの成績が 良ければ増加し コンテストの成績が 悪ければ減少する

  32. 1 162 -3 AtCoder のレーティング 32 また、レーティングに応じて色が付けられる たとえば、レーティングが 2800 以上であ

    れば赤色になる オレンジ 黄色 青色 水色 緑色 茶色 灰色 赤 400 800 1200 1600 2000 2400 2800
  33. 1 162 -3 AtCoder のレーティング 33 初心者は、まず茶色を目指しましょう! オレンジ 黄色 青色

    水色 緑色 茶色 灰色 赤 400 800 1200 1600 2000 2400 2800 注意 茶色は下から 2 番目の色ですが、上位 40% なのでかなりすごいです。エンジニアで茶色 になれない人も多いです。
  34. 1.1 1.2 1.3 AtCoder について 競技プログラミングとは AtCoder のレーティング 1.4 競プロに参加するメリット

  35. 1 162 -4 競プロのメリット 35 AtCoder などのコンテストに参加する メリットは何か? 3 つ紹介します

  36. 1 162 -4 競プロのメリット 36 1 2 3 プログラミング力 思考力

    楽しさ 競プロの問題を解くには、当然プ ログラムを書く必要がある コンテストに参加していくと プログラムを書く能力が身に つく! →
  37. 1 162 -4 競プロのメリット 37 詳しくは 3 章で説明するが、競 プロの問題の中には思考力が要求 されるものもある

    問題を解いていくうちに数学 的思考力が身につく! → 1 2 3 プログラミング力 思考力 楽しさ
  38. 1 162 -4 競プロのメリット 38 1 2 3 プログラミング力 思考力

    楽しさ さらに、プログラマにとって必須 のアルゴリズムの知識も身につけ ることができる!
  39. 1 162 -4 競プロのメリット 39 AtCoder では同時に 5000 人以 上の参加者と対戦できる(リアル

    タイムの順位表もある) ゲーム感覚で楽しんで参加で きる! → 1 2 3 プログラミング力 思考力 楽しさ
  40. 1 162 -4 競プロのメリット:結論 40 このように、競技プログラミングでは… プログラムを書く能力 アルゴリズムの知識 数学的思考力・論理的思考力 などを楽しんで身につけることができる!

  41. 1 162 -4 競プロのメリット:結論 41 このように、競技プログラミングでは… プログラムを書く能力 アルゴリズムの知識 数学的思考力・論理的思考力 などを楽しんで身につけることができる!

    というわけで 競技プログラミングに 参加しましょう!
  42. 1 162 -4 競プロのメリット:補足 42 なお、競プロが就職・転職や コーディングテストに 役立つ場合もある※ ※もちろん会社や業種によります。 例:AtCoder

    対応の就活サイト (https://jobs.atcoder.jp/)
  43. 第 2 章 AtCoder の始め方

  44. 2 162 -0 第 2 章の内容 44 第 2 章では、いよいよ

    AtCoder で競プロを 始める方法を解説します AtCoder で 問題を解くには? AtCoder に 登録するには?
  45. 2.1 2.2 2.3 AtCoder で問題を解こう AtCoder の登録方法 次の一歩へ 2.4 コードテストについて

  46. 2 162 -1 AtCoder の登録方法 46 まず、https://atcoder.jp にアクセスしてください (AtCoder と検索すれば、一番上に出てくると思います)

    Step 1
  47. 2 162 -1 AtCoder の登録方法 47 下のような画面が出るので、新規登録ボタンを押してください (スマホの場合:画面右上のメニューバーを開いて新規登録を押す) Step 2

  48. 2 162 -1 AtCoder の登録方法 48 次に、登録フォームを埋めてください (ユーザー名・パスワードなどを入れる必要があります) Step 3

  49. 2 162 -1 AtCoder の登録方法 49 フォームを埋め終わったら、新規登録ボタンを押してください Step 4

  50. 2 162 -1 AtCoder の登録方法 50 これで登録完了!

  51. 2.1 2.2 2.3 AtCoder で問題を解こう AtCoder の登録方法 次の一歩へ 2.4 コードテストについて

  52. 2 162 -2 AtCoder で問題を解こう 52 それでは、早速 AtCoder のチュートリアル問題を 1

    問解いてみましょう!
  53. 2 162 -2 AtCoder で問題を解こう 53 Step 1 まず、https://atcoder.jp/contests/abs にアクセスします

    (AtCoder Beginners Selection と検索すると出てきます)
  54. 2 162 -2 AtCoder で問題を解こう 54 Step 2 すると、上のような画面が出るので参加登録ボタンを押します 続いて、「問題」ボタンを押します

  55. 2 162 -2 AtCoder で問題を解こう 55 Step 3 問題一覧が出てくるので、とりあえず 一番上の「PracticeA

    - Welcome To AtCoder」を開きます ※ 1 問目の「Welcome to AtCoder」はチュートリアル用に作られた問題です
  56. 2 162 -2 AtCoder で問題を解こう 56 Step 4 これで、解きたい問題を開くことができました。

  57. 2 162 -2 AtCoder で問題を解こう 57 それでは、問題文の意味を確認していきましょう

  58. 2 162 -2 AtCoder で問題を解こう 58 本文 制約 AtCoder の問題文は、本文・制約・入出力形式・例の

    4 つの部分に分かれています 入出力形式 例 整数 𝒂, 𝒃, 𝒄 と文字列 𝒔 が与えられる。 𝒂 + 𝒃 + 𝒄 の計算結果 と文字列 𝒔 を並べて 出力せよ。 • 𝒂, 𝒃, 𝒄 は 𝟏 以上 𝟏𝟎𝟎 以下の整数 • 𝒔 は 𝟏𝟎𝟎 文字以下 入力: 𝒂 𝒃 𝒄 𝒔 出力: 𝒂 + 𝒃 + 𝒄 と 𝒔 を空白区切り で出力 入力: 1 2 3 test 出力: 6 test
  59. 2 162 -2 AtCoder で問題を解こう 59 本文では、どのような問題を解けばよいのかが 説明されています 制約 入出力形式

    例 • 𝒂, 𝒃, 𝒄 は 𝟏 以上 𝟏𝟎𝟎 以下の整数 • 𝒔 は 𝟏𝟎𝟎 文字以下 入力: 𝒂 𝒃 𝒄 𝒔 出力: 𝒂 + 𝒃 + 𝒄 と 𝒔 を空白区切り で出力 入力: 1 2 3 test 出力: 本文 整数 𝒂, 𝒃, 𝒄 と文字列 𝒔 が与えられる。 𝒂 + 𝒃 + 𝒄 の計算結果 と文字列 𝒔 を並べて 出力せよ。 6 test
  60. 2 162 -2 AtCoder で問題を解こう 60 制約では、入力としてどのようなデータが 与えられるかが記されています 本文 入出力形式

    例 整数 𝒂, 𝒃, 𝒄 と文字列 𝒔 が与えられる。 𝒂 + 𝒃 + 𝒄 の計算結果 と文字列 𝒔 を並べて 出力せよ。 入力: 𝒂 𝒃 𝒄 𝒔 出力: 𝒂 + 𝒃 + 𝒄 と 𝒔 を空白区切り で出力 入力: 1 2 3 test 出力: 制約 • 𝒂, 𝒃, 𝒄 は 𝟏 以上 𝟏𝟎𝟎 以下の整数 • 𝒔 は 𝟏𝟎𝟎 文字以下 6 test つまり、𝒂 = 𝟏𝟎𝟏 のようなデータが与 えられることはないと思ってよい! ※2 章では制約をあまり気にしなくても良 いですが、3 章では重要になります。
  61. 2 162 -2 AtCoder で問題を解こう 61 入出力形式では、どういうフォーマットで入力・出力を 行えば良いかが記されています 本文 入出力形式

    例 整数 𝒂, 𝒃, 𝒄 と文字列 𝒔 が与えられる。 𝒂 + 𝒃 + 𝒄 の計算結果 と文字列 𝒔 を並べて 出力せよ。 入力: 𝒂 𝒃 𝒄 𝒔 出力: 𝒂 + 𝒃 + 𝒄 と 𝒔 を空白区切り で出力 入力: 1 2 3 test 出力: 制約 • 𝒂, 𝒃, 𝒄 は 𝟏 以上 𝟏𝟎𝟎 以下の整数 • 𝒔 は 𝟏𝟎𝟎 文字以下 ※フォーマットに従わなければ不正解となる場合がありますので、注意してください たとえばこの問題では、入力として • 1 行目に 𝒂 が与えられる • 2 行目に 𝒃, 𝒄 が空白区切りで与えられる • 3 行目に 𝒔 が与えられる 6 test
  62. 2 162 -2 AtCoder で問題を解こう 62 本文 制約 例では、「どういう入力であればどういう出力が正しいか」の 具体例が示されています

    入出力形式 例 整数 𝒂, 𝒃, 𝒄 と文字列 𝒔 が与えられる。 𝒂 + 𝒃 + 𝒄 の計算結果 と文字列 𝒔 を並べて 出力せよ。 • 𝒂, 𝒃, 𝒄 は 𝟏 以上 𝟏𝟎𝟎 以下の整数 • 𝒔 は 𝟏𝟎𝟎 文字以下 入力: 𝒂 𝒃 𝒄 𝒔 出力: 𝒂 + 𝒃 + 𝒄 と 𝒔 を空白区切り で出力 入力: 1 2 3 test 出力: 6 test
  63. 2 162 -2 AtCoder で問題を解こう 63 問題文は理解できましたか? それでは実際に解いてみましょう

  64. 2 162 -2 AtCoder で問題を解こう 64 Step 4 問題を解くプログラムを実装します 例:C++/Python

    の場合、以下のコードを書けば良いです #include <iostream> #include <string> 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
  65. 2 162 -2 AtCoder で問題を解こう 65 Step 5 実装ができたら、問題文下部の提出欄にソースコードを貼り付け 提出ボタンを押しましょう

  66. 2 162 -2 AtCoder で問題を解こう 66 Step 6 すると、上のような提出画面が表示されます 最初は

    WJ ですが、自動で採点されて約 10 秒で AC に変わります
  67. 2 162 -2 AtCoder で問題を解こう 67 「AC」と出れば正解です おめでとうございます!!!

  68. 2 162 -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)
  69. 2 162 -2 判定について 69 そのほかにも、上の表に示すような判定がある 正解 不正解(1 つ以上のケースで間違った出力をしている) 実行時間制限超過(詳しくは

    3 章で説明します) 実行時エラー(0 割りなど) コンパイルエラー 採点中 AC WA TLE RE CE WJ
  70. 2.1 2.2 2.3 AtCoder で問題を解こう AtCoder の登録方法 次の一歩へ 2.4 コードテストについて

  71. 2 162 -3 次のステップへ 71 それでは、チュートリアル問題の次は どうすれば良いのか?

  72. 2 162 -3 チュートリアル問題の次は? 72 Step 1 プログラミングの基本文法に慣れていない人は C++ 入門用教材

    APG4B を解く ※URL:https://atcoder.jp/contests/APG4b
  73. 2 162 -3 チュートリアル問題の次は? 73 Step 2 AtCoder Beginners Selections

    を解いて 競プロの問題のイメージをつかむ ※URL:https://atcoder.jp/contests/abs
  74. 2 162 -3 チュートリアル問題の次は? 74 Step 3 これでコンテストに出る準備は万端! コンテストに出場しよう! 2

    1 3
  75. 2 162 -3 コンテストについて 75 コンテストに関する注意

  76. 2 162 -3 コンテストについて 76 AtCoder には 4 種類のコンテストがありますが… 初心者には

    ABC がオススメ! 注意1 AtCoder Beginner Contest (ABC) AtCoder Regular Contest (ARC) AtCoder Grand Contest (AGC) AtCoder Heuristic Contest (AHC)
  77. 2 162 -3 コンテストについて 77 ただし、ABC は Beginner Contest という名前ですが

    それほど簡単ではないことに注意! 注意2 初心者は 8 問中 2 問解ければ十分です※ ※筆者(2022/11/21 時点で国内ランキング18位)でも全問正解できないことの方が多いです。 ※ ARC や AGC はさらに難しいです。 簡単だと思って参加したら解けなくて挫折する人が多いです Beginner Contest という名前が問題だと思うのですが…
  78. 2.1 2.2 2.3 AtCoder で問題を解こう AtCoder の登録方法 次の一歩へ 2.4 コードテストについて

  79. 2 162 -3 コードテストについて 79 最後に、AtCoder 上でプログラムを 実行できる便利な機能 コードテスト の使い方を紹介します

  80. 2 162 -3 コードテストについて 80 Step 1 まず、コンテストページ右上の コードテストをクリックします ※上の画像は、2.2

    節で扱った AtCoder Beginners Selection の場合の例となっています。
  81. 2 162 -3 コードテストについて 81 Step 2 すると、このような画面が出て くるので、ソースコードと入力 を書きます

    ここに ソースコードを書く ここに入力を書く
  82. 2 162 -3 コードテストについて 82 Step 3 それが終わったら、実行ボタン を押します ※右図のソースコードは、2

    つの整数 𝒂, 𝒃 を入力し、𝒂 + 𝒃 を出力するものです
  83. 2 162 -3 コードテストについて 83 Step 4 数秒待つと、画面下部に実行結果 が出力されます ※たしかに正しい値

    123+456=579 が 出力されているのがわかります
  84. 2 162 -3 コードテストについて 84 Step 4 数秒待つと、画面下部に実行結果 が出力されます ※たしかに正しい値

    123+456=579 が 出力されているのがわかります コードテストの使い方は わかりましたか?
  85. 2 162 -3 コードテストについて 85 コードテストを使えば、手元に実行環境がなくても Web 上でプログラムを実装できます 必要な人はぜひ活用しましょう!

  86. 第 3 章 アルゴリズムと思考力

  87. 3 162 -1 ここまでの振り返り 87 第 1 章・第 2 章では、

    競技プログラミングとは何か? AtCoder とは何か? AtCoder で問題を解く方法は? などを解説しました
  88. 3 162 -1 新たな疑問 88 それでは、競プロではどういうスキルが 求められるのか?

  89. 3 162 -1 競プロの流れ(再掲) 89 まず競プロでは、プログラムを実装する必要があります 参加者にいくつかの 問題が与えられる 問題 A

    問題 C 問題 B 試験時間内に 多く得点した方が上位 2 1 3 問題を解く プログラムを実装
  90. 3 162 -1 競プロの流れ(再掲) 90 そのため、「プログラムを書く能力」が当然求められます 参加者にいくつかの 問題が与えられる 問題 A

    問題 C 問題 B 問題を解く プログラムを実装 試験時間内に 多く得点した方が上位 2 1 3
  91. 3 162 -1 競プロで必要なスキル 91 しかし、プログラミング能力だけで 十分なのでしょうか?

  92. 3 162 -1 競プロで必要なスキル 92 競プロの難しい問題を解くためには 「アルゴリズム」と「数学的思考力」も重要になります 数学的思考力 アルゴリズムの知識 ?

    ※「アルゴリズム」という言葉の意味は、p.XXX で説明されています
  93. 3 162 -1 • 3.2 節/3.3 節では、アルゴリズムの知識や数学的思考力がどういう 問題で活躍するのかを紹介します • 皆さん、ぜひ楽しんでお読みください!

    第 3 章の内容 93 ※難しかったら読み飛ばしても構いません。
  94. 3.1 3.2 3.3 アルゴリズムの知識 競プロで求められるスキル 数学的思考力

  95. 3 162 -2 アルゴリズムが重要となる例 95 まずは迷路の問題を考えてみましょう

  96. 3 162 -2 迷路の問題 96 1 手で上下左右に隣り合うマスに移動できる スタートからゴールへ 最短何手で移動できるか? ゴール

    S G スタート ※ただし、迷路の大きさは 50×50 まで。
  97. 3 162 -2 迷路の問題 97 たとえば、全部の経路を調べれば 答えを求めることができる

  98. 3 162 -2 迷路の問題:全探索 98 ところが、スタート地点から出発する経路はたくさんある!

  99. 3 162 -2 迷路の問題:全探索 99 ところが、スタート地点から出発する経路はたくさんある! 約 150,000 通り

  100. 3 162 -2 迷路の問題:全探索 100 さらに迷路が大きくなると…

  101. 3 162 -2 迷路の問題:全探索 101 >15万通り

  102. 3 162 -2 迷路の問題:全探索 102 >1400万通り >15万通り

  103. 3 162 -2 迷路の問題:全探索 103 >1400万通り >380億通り >15万通り

  104. 3 162 -2 迷路の問題:全探索 104 >380億通り 実は、コンピュータの演算速度は 毎秒 1 億回程度

    つまり単純に割り算しても 5 分以上かかることに! ※実行環境やプログラミング言語によって変わりますが、AtCoder 上で Python を動かした場合、毎秒 1 億回程度になります
  105. 3 162 -2 迷路の問題:全探索 105 >380億通り コンピュータの演算速度は 毎秒 1 億回程度

    つまり単純に割り算しても 5 分以上かかることに! ※実行環境やプログラミング言語によって変わりますが、AtCoder 上で Python を動かした場合、毎秒 1 億回程度になります そして競プロの問題では、数秒以内で実行が終わらなければ 不正解となってしまう!
  106. 3 162 -2 迷路の問題:解法の工夫 106 そこで、解法を工夫すると とても簡単に答えを求めることができる

  107. 3 162 -2 迷路の問題:解法の工夫 107 0 スタートに 0 を書く ※書かれた数は、スタートからの最短手数を意味します。

  108. 3 162 -2 迷路の問題:解法の工夫 108 0 1 0 の隣に 1

    を書く ※書かれた数は、スタートからの最短手数を意味します。
  109. 3 162 -2 迷路の問題:解法の工夫 109 0 1 2 1 の隣に

    2 を書く ※書かれた数は、スタートからの最短手数を意味します。
  110. 3 162 -2 迷路の問題:解法の工夫 110 0 1 2 3 2

    の隣に 3 を書く ※書かれた数は、スタートからの最短手数を意味します。
  111. 3 162 -2 迷路の問題:解法の工夫 111 0 4 1 2 3

    4 3 の隣に 4 を書く ※書かれた数は、スタートからの最短手数を意味します。
  112. 3 162 -2 迷路の問題:解法の工夫 112 0 4 5 1 2

    3 4 5 4 の隣に 5 を書く ※書かれた数は、スタートからの最短手数を意味します。
  113. 3 162 -2 迷路の問題:解法の工夫 113 0 4 5 6 1

    2 3 4 6 5 5 の隣に 6 を書く ※書かれた数は、スタートからの最短手数を意味します。
  114. 3 162 -2 迷路の問題:解法の工夫 114 0 4 5 6 1

    2 3 7 4 7 6 5 6 の隣に 7 を書く ※書かれた数は、スタートからの最短手数を意味します。
  115. 3 162 -2 迷路の問題:解法の工夫 115 0 4 5 6 1

    2 3 7 4 8 7 6 5 8 7 の隣に 8 を書く ※書かれた数は、スタートからの最短手数を意味します。
  116. 3 162 -2 迷路の問題:解法の工夫 116 0 4 5 6 1

    2 3 7 4 8 9 7 6 5 9 8 9 8 の隣に 9 を書く ※書かれた数は、スタートからの最短手数を意味します。
  117. 3 162 -2 迷路の問題:解法の工夫 117 0 4 5 6 1

    2 3 7 4 8 9 10 7 6 5 9 10 8 10 9 10 9 の隣に 10 を書く ※書かれた数は、スタートからの最短手数を意味します。
  118. 3 162 -2 迷路の問題:解法の工夫 118 0 4 5 6 1

    2 3 7 11 4 8 9 10 7 6 5 9 10 8 11 10 9 11 10 11 11 10 の隣に 11 を書く ※書かれた数は、スタートからの最短手数を意味します。
  119. 3 162 -2 迷路の問題:解法の工夫 119 0 4 5 6 12

    1 2 3 7 11 4 8 9 10 7 6 5 9 10 8 11 10 9 12 11 12 10 11 12 11 12 12 11 の隣に 12 を書く ※書かれた数は、スタートからの最短手数を意味します。
  120. 3 162 -2 迷路の問題:解法の工夫 120 0 4 5 6 12

    13 1 2 3 7 11 4 8 9 10 7 6 5 9 10 8 11 10 9 13 12 11 12 13 10 11 12 13 11 12 13 12 13 12 の隣に 13 を書く ※書かれた数は、スタートからの最短手数を意味します。
  121. 3 162 -2 迷路の問題:解法の工夫 121 0 4 5 6 12

    13 14 1 2 3 7 11 4 8 9 10 7 6 5 9 10 8 11 10 14 9 13 12 11 12 13 10 11 12 13 11 12 13 12 13 14 13 の隣に 14 を書く ※書かれた数は、スタートからの最短手数を意味します。
  122. 3 162 -2 迷路の問題:解法の工夫 122 0 4 5 6 12

    13 14 1 2 3 7 11 15 4 8 9 10 7 6 5 9 10 8 11 10 14 15 9 13 12 11 12 13 10 11 12 13 11 12 13 12 13 14 15 14 の隣に 15 を書く ※書かれた数は、スタートからの最短手数を意味します。
  123. 3 162 -2 迷路の問題:解法の工夫 123 0 4 5 6 12

    13 14 1 2 3 7 11 15 4 8 9 10 16 7 6 5 9 10 16 8 11 10 14 15 16 9 13 12 11 12 13 10 11 12 13 11 12 13 12 13 14 15 16 15 の隣に 16 を書く ※書かれた数は、スタートからの最短手数を意味します。
  124. 3 162 -2 迷路の問題:解法の工夫 124 0 4 5 6 12

    13 14 1 2 3 7 11 15 4 8 9 10 16 7 6 5 9 10 16 17 8 11 10 14 15 16 9 13 12 11 12 13 17 10 11 12 13 11 12 13 17 12 13 14 15 16 16 の隣に 17 を書く ※書かれた数は、スタートからの最短手数を意味します。
  125. 3 162 -2 迷路の問題:解法の工夫 125 0 4 5 6 12

    13 14 1 2 3 7 11 15 4 8 9 10 16 7 6 5 9 10 16 17 8 11 10 14 15 16 9 13 12 11 12 13 17 10 11 12 13 18 11 12 13 17 18 12 13 14 15 16 17 の隣に 18 を書く ※書かれた数は、スタートからの最短手数を意味します。
  126. 3 162 -2 迷路の問題:解法の工夫 126 0 4 5 6 12

    13 14 1 2 3 7 11 15 4 8 9 10 16 7 6 5 9 10 16 17 8 11 10 14 15 16 9 13 12 11 12 13 17 10 11 12 13 19 18 11 12 13 17 18 19 19 12 13 14 15 16 18 の隣に 19 を書く ※書かれた数は、スタートからの最短手数を意味します。
  127. 3 162 -2 迷路の問題:解法の工夫 127 0 4 5 6 12

    13 14 1 2 3 7 11 15 4 8 9 10 16 7 6 5 9 10 16 17 8 11 10 14 15 16 9 13 12 11 12 13 17 10 11 12 13 19 18 11 12 13 17 18 19 20 19 12 13 14 15 16 20 20 19 の隣に 20 を書く ※書かれた数は、スタートからの最短手数を意味します。
  128. 3 162 -2 迷路の問題:解法の工夫 128 0 4 5 6 12

    13 14 1 2 3 7 11 15 4 8 9 10 16 7 6 5 9 10 16 17 8 11 10 14 15 16 9 13 12 11 12 13 17 10 11 12 13 19 18 11 12 13 17 18 19 20 19 12 13 14 15 16 20 20 19 の隣に 20 を書く ※書かれた数は、スタートからの最短手数を意味します。 ゴールまでの最短手数は 20 手!
  129. 3 162 -2 迷路の問題:解法の工夫 129 0 4 5 6 12

    13 14 1 2 3 7 11 15 4 8 9 10 16 7 6 5 9 10 16 17 8 11 10 14 15 16 9 13 12 11 12 13 17 10 11 12 13 19 18 11 12 13 17 18 19 20 19 12 13 14 15 16 20 20 19 の隣に 20 を書く ※書かれた数は、スタートからの最短手数を意味します。 ゴールまでの最短手数は 20 手! この方法であれば コンピュータで 0.01 秒!
  130. 3 162 -2 迷路の問題:補足 130 0 4 5 6 12

    13 14 1 2 3 7 11 15 4 8 9 10 16 7 6 5 9 10 16 17 8 11 10 14 15 16 9 13 12 11 12 13 17 10 11 12 13 19 18 11 12 13 17 18 19 20 19 12 13 14 15 16 20 20 なお、ゴール地点から始めて 20→19→18→ 17→… と数字が小さくなる方向に動くと、具体 的な最短経路がわかる ※書かれた数は、スタートからの最短手数を意味します。
  131. 3 162 -2 解法を思いつくために 131 さて、一体どうすれば こんな解法が思いつけるのか?

  132. 3 162 -2 解法を思いつくために 132 以下のような「典型的なアルゴリズム」を 知っているだけで結構変わる! 累積和 二分探索 動的計画法

    深さ優先探索 幅優先探索 ダイクストラ法 素数判定法 ユークリッドの互除法 繰り返し二乗法
  133. 3 162 -2 解法を思いつくために 133 たとえば迷路の場合は「幅優先探索」を 知っていれば思いつける 累積和 二分探索 動的計画法

    深さ優先探索 幅優先探索 ダイクストラ法 素数判定法 ユークリッドの互除法 繰り返し二乗法
  134. 3 162 -2 補足 134 補足:アルゴリズムとは?

  135. 3 162 -2 • 問題を解く手順(解法)のことを、プログラミングの文脈では アルゴリズムという • 基本的には、計算の速く終わる方が「良いアルゴリズム」 • たとえば迷路の問題の場合、経路を全部調べるアルゴリズムより、隣に数を書

    いていくアルゴリズムの方が、良いといえる 補足:アルゴリズムとは? 135 ※なお、特に競プロ以外の文脈では、良いアルゴリズムの指標として、計算時間だけでなくメモリ使用量などが使われることもあります
  136. 3.1 3.2 3.3 アルゴリズムの知識 競プロで求められるスキル 数学的思考力

  137. 3 162 -3 数学的思考が重要になる例 137 まず、コマを移動させる問題を 考えてみましょう

  138. 3 162 -3 ピッタリ移動する問題 138 • 5 個のマスが一列に並んだマス目がある • 隣り合うマスへの移動をちょうど

    𝑵 回行うことで、左端から右端に移動する ことはできるか? 5 個 ゴール スタート ※制約:𝑵 は 1 以上 100 以下 (入力は 𝑵 のみ)
  139. 3 162 -3 ピッタリ移動する問題 139 例:𝑵 = 𝟑 の場合 1

    2 3 No… そもそもたどり着かない…
  140. 3 162 -3 ピッタリ移動する問題 140 1 2 3 4 5

    6 よし、行けた! 例:𝑵 = 𝟔 の場合 Yes!
  141. 3 162 -3 ピッタリ移動する問題 141 1 2 3 5 4

    1 回余ってしまう… 例:𝑵 = 𝟓 の場合 No…
  142. 3 162 -3 ピッタリ移動する問題:全探索 142 それでは、どうやって解けば良いか?

  143. 3 162 -3 ピッタリ移動する問題:全探索 143 まず、あり得る経路を全部調べれば、答えがわかる (例:𝑵 = 𝟓 の場合、上の

    9 通りが全部ダメなので答えは No)
  144. 3 162 -3 ピッタリ移動する問題:全探索 144 まず、あり得る経路を全部調べれば、答えがわかる (例:𝑵 = 𝟓 の場合、上の

    9 通りが全部ダメなので答えは No) 約 5,600億 通り しかし、𝑵 = 𝟓𝟎 になると コンピュータでも無理!
  145. 3 162 -3 ピッタリ移動する問題:全探索 145 まず、あり得る経路を全部調べれば、答えがわかる (例:𝑵 = 𝟓 の場合、上の

    9 通りが全部ダメなので答えは No) 約 5,600億 通り しかし、𝑵 = 𝟓𝟎 になると コンピュータでも無理! そこで、「偶奇で場合分けする」という 数学的思考をすると簡単に解ける!
  146. 3 162 -3 工夫した解法 146 まず、𝑵 が偶数の場合 𝑵 = 𝟐

    の場合は、手数的に無理だが 𝑵 ≥ 𝟒 の場合は、ゴールまで一直線に進んだ後、ゴール付近を 往復すれば良いので Yes
  147. 3 162 -3 工夫した解法 147 まず、𝑵 が偶数の場合 𝑵 = 𝟐

    の場合は、手数的に無理だが 𝑵 ≥ 𝟒 の場合は、ゴールまで一直線に進んだ後、ゴール付近を 往復すれば良いので Yes 𝑵 = 𝟒 のとき 𝑵 = 𝟔 のとき 𝑵 = 𝟖 のとき
  148. 3 162 -3 工夫した解法 148 一方、𝑵 が奇数の場合 左から 1・3・5 マス目を青、2・4

    マス目を白で塗ると…
  149. 3 162 -3 工夫した解法 149 一方、𝑵 が奇数の場合 左から 1・3・5 マス目を青、2・4

    マス目を白で塗ると… 青 白 青 白 青 白 青 白 青 白 白 青 青 白 白 白 青 青 必ず「青→白→青→白→…」 という順番で移動 𝑵 が奇数のときは白色で終わる
  150. 3 162 -3 工夫した解法 150 一方、𝑵 が奇数の場合 左から 1・3・5 マス目を青、2・4

    マス目を白で塗ると… 白 白 白 必ず「青→白→青→白→…」 という順番で移動 𝑵 が奇数のときは白色で終わる たしかに 𝑵 = 𝟓 のときは 全部白色で終わっている
  151. 3 162 -3 工夫した解法 151 一方、𝑵 が奇数の場合 左から 1・3・5 マス目を青、2・4

    マス目を白で塗ると… 白 白 白 必ず「青→白→青→白→…」 という順番で移動 𝑵 が奇数のときは白色で終わる たしかに 𝑵 = 𝟓 のときは 全部白色で終わっている ところが、ゴールのマスは青色である 𝑵 が奇数のときは、答えは No
  152. 3 162 -3 工夫した解法 152 このように、偶奇で場合分けして考えると、簡単に答えがわかる 𝑵 が偶数の場合 𝑵 が奇数の場合

    𝑵 = 𝟐 でなければ Yes 絶対に No
  153. 3 162 -3 工夫した解法 153 競技プログラミングでは、今回のように 数学的思考力 が必要な問題が出ることもある!

  154. スライドのまとめ

  155. 4 162 • 競技プログラミングは、プログラミングの問題を速く正確に解く競技で あり、略して競プロと呼ばれることもある • 世界では様々な競プロの大会がある • AtCoder、情報オリンピック、ICPC、Google Code

    Jam など • 第 2 章では、AtCoder の使い方を中心に説明した スライドのまとめ 155
  156. 4 162 スライドのまとめ 156 もちろん競プロでは、速くプログラムを書く能力も重要

  157. 4 162 スライドのまとめ 157 しかし競プロでは、数秒以内に実行が終わる 効率的なプログラムが求められる!

  158. 4 162 スライドのまとめ 158 したがって、より良い解法を考えるための アルゴリズムの知識と数学的思考力も同じくらい重要! ? (そして、解法を考える部分が一番面白い!)

  159. 4 162 スライドのまとめ 159 さて、アルゴリズムと思考力を 身につけるには?

  160. 4 162 本の紹介 160 競技プログラミングの鉄則 2022年9月発売/筆者が執筆 フルカラーの図が豊富で分かりやすい! AtCoder 自動採点システム付きの演習問題! C++/Python/Java

    に対応! 特徴 1 2 3 興味のある方はぜひお読みください! ※なお、本の紙面には C++ しか載っていませんが、サポートページには Python/Java のプログラムがすべて載っています 発売2カ月で4刷
  161. 4 162 1. 米田優峻:『競技プログラミングの鉄則』(マイナビ出版、2022) 2. 米田優峻:『「アルゴリズム×数学」が基礎からしっかり身につく本』(技術評論社、2021) 3. 大槻兼資:『プログラミングコンテストAtCoder入門』(KADOKAWA、2022) 4. 米田優峻:『レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【初級編:競プロを始めよう】』

    (Qiita で公開) 5. 大槻兼資:『AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~』 (Qiita で公開) 6. テレ東BIZ:未経験者のアナタもハマる?競技プログラミング「AtCoder」って何だ?【橋本幸治の理系通信】 7. https://atcoder.jp/ 参考文献 161
  162. 最後までスライドをお読みいただき ありがとうございました