Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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
    [完全版]

    View full-size slide

  2. 162
    自己紹介 2
    米田 優峻 (よねだ まさたか)
    • 2002年生まれ
    • 2021年東京大学入学
    主な実績
    • 国際情報オリンピック ‘18, ‘19, ‘20 金メダル
    • 著書『アルゴリズム×数学』
    • 著書『競技プログラミングの鉄則』

    View full-size slide

  3. 162
    はじめに 3
    現在、競技プログラミング(競プロ)の
    人気が高まっています

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide


  7. 1 章
    競技プログラミングとは

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. 1
    162
    -1
    競プロの問題 12
    Q. どんな問題が出されるか?

    View full-size slide

  13. 1
    162
    -1
    競プロの問題 13
    ※ここで問題を解く必要はありません。どんな問題が出されるかのイメージをつかんだら、次のページに進んでかまいません。
    整数 𝑵, 𝑲 が与えられます。
    𝟏 以上 𝑵 以下の 3 つの整数を重複
    なしで選び、合計を 𝑲 にする方法
    は何通りですか?
    答えを出力するプログラムを作成
    してください。
    ※ 𝑵, 𝑲 は 100 以下

    View full-size slide

  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 以下

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  17. 1
    162
    -1
    コンテストの種類 17
    Q. どんなコンテストがあるのか?

    View full-size slide

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

    View full-size slide

  19. 1
    162
    -1
    GCJ
    年に一度の世界大会
    ICPC
    大学生向けのチーム戦
    情報オリンピック
    中高生向けの大会
    コンテストの種類 19
    AtCoder
    日本最大手のコンテスト
    次節では最大規模の AtCoder について紹介します
    毎週開催されるので
    初心者にもおすすめできる!

    View full-size slide

  20. 1.1
    1.2
    1.3
    AtCoder について
    競技プログラミングとは
    AtCoder のレーティング
    1.4 競プロに参加するメリット

    View full-size slide

  21. 1
    162
    -2
    AtCoder とは 21
    日本最大手のプログラミングコンテスト
    毎週土曜の 21 時からコンテストが開催される
    ※日曜の同じ時間帯に開催されることもあります

    View full-size slide

  22. 1
    162
    -2
    AtCoder とは 22
    100 分で 8 問を解き、合計得点を競う
    ※コンテストの約 3 分の 2 を占める AtCoder Beginner Contest の場合

    View full-size slide

  23. 1
    162
    -2
    AtCoder の特徴 23
    AtCoder の
    4 つの特徴

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  29. 1.1
    1.2
    1.3
    AtCoder について
    競技プログラミングとは
    AtCoder のレーティング
    1.4 競プロに参加するメリット

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  32. 1
    162
    -3
    AtCoder のレーティング 32
    また、レーティングに応じて色が付けられる
    たとえば、レーティングが 2800 以上であ
    れば赤色になる
    オレンジ
    黄色
    青色
    水色
    緑色
    茶色
    灰色

    400
    800
    1200
    1600
    2000
    2400
    2800

    View full-size slide

  33. 1
    162
    -3
    AtCoder のレーティング 33
    初心者は、まず茶色を目指しましょう!
    オレンジ
    黄色
    青色
    水色
    緑色
    茶色
    灰色

    400
    800
    1200
    1600
    2000
    2400
    2800
    注意 茶色は下から 2 番目の色ですが、上位 40%
    なのでかなりすごいです。エンジニアで茶色
    になれない人も多いです。

    View full-size slide

  34. 1.1
    1.2
    1.3
    AtCoder について
    競技プログラミングとは
    AtCoder のレーティング
    1.4 競プロに参加するメリット

    View full-size slide

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

    View full-size slide

  36. 1
    162
    -4
    競プロのメリット 36
    1 2 3
    プログラミング力 思考力 楽しさ
    競プロの問題を解くには、当然プ
    ログラムを書く必要がある
    コンテストに参加していくと
    プログラムを書く能力が身に
    つく!

    View full-size slide

  37. 1
    162
    -4
    競プロのメリット 37
    詳しくは 3 章で説明するが、競
    プロの問題の中には思考力が要求
    されるものもある
    問題を解いていくうちに数学
    的思考力が身につく!

    1 2 3
    プログラミング力 思考力 楽しさ

    View full-size slide

  38. 1
    162
    -4
    競プロのメリット 38
    1 2 3
    プログラミング力 思考力 楽しさ
    さらに、プログラマにとって必須
    のアルゴリズムの知識も身につけ
    ることができる!

    View full-size slide

  39. 1
    162
    -4
    競プロのメリット 39
    AtCoder では同時に 5000 人以
    上の参加者と対戦できる(リアル
    タイムの順位表もある)
    ゲーム感覚で楽しんで参加で
    きる!

    1 2 3
    プログラミング力 思考力 楽しさ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  42. 1
    162
    -4
    競プロのメリット:補足 42
    なお、競プロが就職・転職や
    コーディングテストに
    役立つ場合もある※
    ※もちろん会社や業種によります。
    例:AtCoder 対応の就活サイト (https://jobs.atcoder.jp/)

    View full-size slide


  43. 2 章
    AtCoder の始め方

    View full-size slide

  44. 2
    162
    -0
    第 2 章の内容 44
    第 2 章では、いよいよ AtCoder で競プロを
    始める方法を解説します
    AtCoder で
    問題を解くには?
    AtCoder に
    登録するには?

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  53. 2
    162
    -2
    AtCoder で問題を解こう 53
    Step 1 まず、https://atcoder.jp/contests/abs にアクセスします
    (AtCoder Beginners Selection と検索すると出てきます)

    View full-size slide

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

    View full-size slide

  55. 2
    162
    -2
    AtCoder で問題を解こう 55
    Step 3 問題一覧が出てくるので、とりあえず
    一番上の「PracticeA - Welcome To AtCoder」を開きます
    ※ 1 問目の「Welcome to AtCoder」はチュートリアル用に作られた問題です

    View full-size slide

  56. 2
    162
    -2
    AtCoder で問題を解こう 56
    Step 4 これで、解きたい問題を開くことができました。

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  63. 2
    162
    -2
    AtCoder で問題を解こう 63
    問題文は理解できましたか?
    それでは実際に解いてみましょう

    View full-size slide

  64. 2
    162
    -2
    AtCoder で問題を解こう 64
    Step 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

    View full-size slide

  65. 2
    162
    -2
    AtCoder で問題を解こう 65
    Step 5 実装ができたら、問題文下部の提出欄にソースコードを貼り付け
    提出ボタンを押しましょう

    View full-size slide

  66. 2
    162
    -2
    AtCoder で問題を解こう 66
    Step 6 すると、上のような提出画面が表示されます
    最初は WJ ですが、自動で採点されて約 10 秒で AC に変わります

    View full-size slide

  67. 2
    162
    -2
    AtCoder で問題を解こう 67
    「AC」と出れば正解です
    おめでとうございます!!!

    View full-size slide

  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)

    View full-size slide

  69. 2
    162
    -2
    判定について 69
    そのほかにも、上の表に示すような判定がある
    正解
    不正解(1 つ以上のケースで間違った出力をしている)
    実行時間制限超過(詳しくは 3 章で説明します)
    実行時エラー(0 割りなど)
    コンパイルエラー
    採点中
    AC
    WA
    TLE
    RE
    CE
    WJ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  72. 2
    162
    -3
    チュートリアル問題の次は? 72
    Step 1 プログラミングの基本文法に慣れていない人は
    C++ 入門用教材 APG4B を解く
    ※URL:https://atcoder.jp/contests/APG4b

    View full-size slide

  73. 2
    162
    -3
    チュートリアル問題の次は? 73
    Step 2 AtCoder Beginners Selections を解いて
    競プロの問題のイメージをつかむ
    ※URL:https://atcoder.jp/contests/abs

    View full-size slide

  74. 2
    162
    -3
    チュートリアル問題の次は? 74
    Step 3 これでコンテストに出る準備は万端!
    コンテストに出場しよう!
    2
    1
    3

    View full-size slide

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

    View full-size slide

  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)

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  80. 2
    162
    -3
    コードテストについて 80
    Step 1
    まず、コンテストページ右上の
    コードテストをクリックします
    ※上の画像は、2.2 節で扱った AtCoder Beginners Selection の場合の例となっています。

    View full-size slide

  81. 2
    162
    -3
    コードテストについて 81
    Step 2
    すると、このような画面が出て
    くるので、ソースコードと入力
    を書きます
    ここに
    ソースコードを書く
    ここに入力を書く

    View full-size slide

  82. 2
    162
    -3
    コードテストについて 82
    Step 3
    それが終わったら、実行ボタン
    を押します
    ※右図のソースコードは、2 つの整数 𝒂, 𝒃
    を入力し、𝒂 + 𝒃 を出力するものです

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  85. 2
    162
    -3
    コードテストについて 85
    コードテストを使えば、手元に実行環境がなくても
    Web 上でプログラムを実装できます
    必要な人はぜひ活用しましょう!

    View full-size slide


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

    View full-size slide

  87. 3
    162
    -1
    ここまでの振り返り 87
    第 1 章・第 2 章では、
    競技プログラミングとは何か?
    AtCoder とは何か?
    AtCoder で問題を解く方法は?
    などを解説しました

    View full-size slide

  88. 3
    162
    -1
    新たな疑問 88
    それでは、競プロではどういうスキルが
    求められるのか?

    View full-size slide

  89. 3
    162
    -1
    競プロの流れ(再掲) 89
    まず競プロでは、プログラムを実装する必要があります
    参加者にいくつかの
    問題が与えられる
    問題
    A
    問題
    C
    問題
    B
    試験時間内に
    多く得点した方が上位
    2
    1
    3
    問題を解く
    プログラムを実装

    View full-size slide

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

    View full-size slide

  91. 3
    162
    -1
    競プロで必要なスキル 91
    しかし、プログラミング能力だけで
    十分なのでしょうか?

    View full-size slide

  92. 3
    162
    -1
    競プロで必要なスキル 92
    競プロの難しい問題を解くためには
    「アルゴリズム」と「数学的思考力」も重要になります
    数学的思考力
    アルゴリズムの知識
    ?
    ※「アルゴリズム」という言葉の意味は、p.XXX で説明されています

    View full-size slide

  93. 3
    162
    -1
    • 3.2 節/3.3 節では、アルゴリズムの知識や数学的思考力がどういう
    問題で活躍するのかを紹介します
    • 皆さん、ぜひ楽しんでお読みください!
    第 3 章の内容 93
    ※難しかったら読み飛ばしても構いません。

    View full-size slide

  94. 3.1
    3.2
    3.3
    アルゴリズムの知識
    競プロで求められるスキル
    数学的思考力

    View full-size slide

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

    View full-size slide

  96. 3
    162
    -2
    迷路の問題 96
    1 手で上下左右に隣り合うマスに移動できる
    スタートからゴールへ
    最短何手で移動できるか?
    ゴール
    S
    G
    スタート
    ※ただし、迷路の大きさは 50×50 まで。

    View full-size slide

  97. 3
    162
    -2
    迷路の問題 97
    たとえば、全部の経路を調べれば
    答えを求めることができる

    View full-size slide

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

    View full-size slide

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

    150,000 通り

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  106. 3
    162
    -2
    迷路の問題:解法の工夫 106
    そこで、解法を工夫すると
    とても簡単に答えを求めることができる

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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 を書く
    ※書かれた数は、スタートからの最短手数を意味します。

    View full-size slide

  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 を書く
    ※書かれた数は、スタートからの最短手数を意味します。

    View full-size slide

  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 を書く
    ※書かれた数は、スタートからの最短手数を意味します。

    View full-size slide

  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 を書く
    ※書かれた数は、スタートからの最短手数を意味します。

    View full-size slide

  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 を書く
    ※書かれた数は、スタートからの最短手数を意味します。

    View full-size slide

  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 を書く
    ※書かれた数は、スタートからの最短手数を意味します。

    View full-size slide

  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 を書く
    ※書かれた数は、スタートからの最短手数を意味します。

    View full-size slide

  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 を書く
    ※書かれた数は、スタートからの最短手数を意味します。

    View full-size slide

  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 を書く
    ※書かれた数は、スタートからの最短手数を意味します。

    View full-size slide

  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 を書く
    ※書かれた数は、スタートからの最短手数を意味します。

    View full-size slide

  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 を書く
    ※書かれた数は、スタートからの最短手数を意味します。

    View full-size slide

  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 手!

    View full-size slide

  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 秒!

    View full-size slide

  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→… と数字が小さくなる方向に動くと、具体
    的な最短経路がわかる
    ※書かれた数は、スタートからの最短手数を意味します。

    View full-size slide

  131. 3
    162
    -2
    解法を思いつくために 131
    さて、一体どうすれば
    こんな解法が思いつけるのか?

    View full-size slide

  132. 3
    162
    -2
    解法を思いつくために 132
    以下のような「典型的なアルゴリズム」を
    知っているだけで結構変わる!
    累積和
    二分探索
    動的計画法
    深さ優先探索
    幅優先探索
    ダイクストラ法
    素数判定法
    ユークリッドの互除法
    繰り返し二乗法

    View full-size slide

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

    View full-size slide

  134. 3
    162
    -2
    補足 134
    補足:アルゴリズムとは?

    View full-size slide

  135. 3
    162
    -2
    • 問題を解く手順(解法)のことを、プログラミングの文脈では
    アルゴリズムという
    • 基本的には、計算の速く終わる方が「良いアルゴリズム」
    • たとえば迷路の問題の場合、経路を全部調べるアルゴリズムより、隣に数を書
    いていくアルゴリズムの方が、良いといえる
    補足:アルゴリズムとは? 135
    ※なお、特に競プロ以外の文脈では、良いアルゴリズムの指標として、計算時間だけでなくメモリ使用量などが使われることもあります

    View full-size slide

  136. 3.1
    3.2
    3.3
    アルゴリズムの知識
    競プロで求められるスキル
    数学的思考力

    View full-size slide

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

    View full-size slide

  138. 3
    162
    -3
    ピッタリ移動する問題 138
    • 5 個のマスが一列に並んだマス目がある
    • 隣り合うマスへの移動をちょうど 𝑵 回行うことで、左端から右端に移動する
    ことはできるか?
    5 個
    ゴール
    スタート
    ※制約:𝑵 は 1 以上 100 以下 (入力は 𝑵 のみ)

    View full-size slide

  139. 3
    162
    -3
    ピッタリ移動する問題 139
    例:𝑵 = 𝟑 の場合
    1 2 3
    No…
    そもそもたどり着かない…

    View full-size slide

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

    View full-size slide

  141. 3
    162
    -3
    ピッタリ移動する問題 141
    1 2 3
    5
    4
    1 回余ってしまう…
    例:𝑵 = 𝟓 の場合 No…

    View full-size slide

  142. 3
    162
    -3
    ピッタリ移動する問題:全探索 142
    それでは、どうやって解けば良いか?

    View full-size slide

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

    View full-size slide

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

    5,600億 通り
    しかし、𝑵 = 𝟓𝟎 になると
    コンピュータでも無理!

    View full-size slide

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

    5,600億 通り
    しかし、𝑵 = 𝟓𝟎 になると
    コンピュータでも無理!
    そこで、「偶奇で場合分けする」という
    数学的思考をすると簡単に解ける!

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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




    白 青

    白 青
    青 白




    必ず「青→白→青→白→…」
    という順番で移動
    𝑵 が奇数のときは白色で終わる

    View full-size slide

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



    必ず「青→白→青→白→…」
    という順番で移動
    𝑵 が奇数のときは白色で終わる
    たしかに 𝑵 = 𝟓 のときは
    全部白色で終わっている

    View full-size slide

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



    必ず「青→白→青→白→…」
    という順番で移動
    𝑵 が奇数のときは白色で終わる
    たしかに 𝑵 = 𝟓 のときは
    全部白色で終わっている
    ところが、ゴールのマスは青色である
    𝑵 が奇数のときは、答えは No

    View full-size slide

  152. 3
    162
    -3
    工夫した解法 152
    このように、偶奇で場合分けして考えると、簡単に答えがわかる
    𝑵 が偶数の場合
    𝑵 が奇数の場合
    𝑵 = 𝟐 でなければ Yes
    絶対に No

    View full-size slide

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

    View full-size slide

  154. スライドのまとめ

    View full-size slide

  155. 4
    162
    • 競技プログラミングは、プログラミングの問題を速く正確に解く競技で
    あり、略して競プロと呼ばれることもある
    • 世界では様々な競プロの大会がある
    • AtCoder、情報オリンピック、ICPC、Google Code Jam など
    • 第 2 章では、AtCoder の使い方を中心に説明した
    スライドのまとめ 155

    View full-size slide

  156. 4
    162
    スライドのまとめ 156
    もちろん競プロでは、速くプログラムを書く能力も重要

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  160. 4
    162
    本の紹介 160
    競技プログラミングの鉄則
    2022年9月発売/筆者が執筆
    フルカラーの図が豊富で分かりやすい!
    AtCoder 自動採点システム付きの演習問題!
    C++/Python/Java に対応!
    特徴
    1
    2
    3
    興味のある方はぜひお読みください!
    ※なお、本の紙面には C++ しか載っていませんが、サポートページには Python/Java のプログラムがすべて載っています
    発売2カ月で4刷

    View full-size slide

  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

    View full-size slide

  162. 最後までスライドをお読みいただき
    ありがとうございました

    View full-size slide