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

競プロへの誘 -いざな-

競プロへの誘 -いざな-

WASD Inc. LT会(仮)
2022-03-25

U76NER

May 16, 2022
Tweet

More Decks by U76NER

Other Decks in Programming

Transcript

  1. 競プロへの誘 -いざな-
    LT会(仮) 2022/03/25
    u76ner

    View Slide

  2. 競プロとは
    2
    - 競プロとは

    - 「競技プログラミング」の略


    - 競技プログラミングでは、参加者全員に同一の課題が出題され、より早く与えら
    れた要求を満足するプログラムを正確に記述することを競う。

    (Wikipedia)


    View Slide

  3. 競プロとは
    3
    - 有名なやつの例

    - AtCoder


    View Slide

  4. 競プロとは
    4
    - 有名なやつの例

    - AIZU ONLINE JUDGE(AOJ)


    View Slide

  5. 競プロとは
    5
    - 問題の入力に対して解答に制限時間内に解答する

    - だいたい2秒とかが多い気がする(↓
    AtCoderでの例)


    View Slide

  6. 競プロとは
    6
    - 問題の入力に対して解答に制限時間内に解答する


    View Slide

  7. 競プロとは
    7
    - 問題の入力に対して解答に制限時間内に解答する


    - 問題を解くこと自体は原理的にできるが、

    ナイーブに実装すると現実的な時間で解くことが不可能
    であることが多い


    View Slide

  8. 計算量の例
    8
    - 例)

    - a
    n+2
    = a
    n+1
    + a
    n
    ,

    a
    1
    = 1,

    a
    2
    = 1

    - このとき、a
    40
    , a
    100
    を求めよ


    - いわゆるフィボナッチ数列


    View Slide

  9. 計算量の例
    9
    - ナイーブな実装




    View Slide

  10. 計算量の例
    10
    - ナイーブな実装



    - a
    100
    が計算できない


    - 計算時間

    - a
    40
    : 604 ms

    - a
    45
    : 6,808 ms

    - a
    50
    : > 1 min


    View Slide

  11. 計算量の例
    11
    - 改善点


    - a
    50
    = a
    49
    + a
    48

    = (a
    48
    + a
    47
    ) + (a
    47
    + a
    46
    )

    = (a
    47
    + a
    46
    ) + (a
    46
    + a
    45
    ) + (a
    46
    + a
    45
    ) + (a
    45
    + a
    44
    )

    = …


    View Slide

  12. 計算量の例
    12
    - 改善点


    - a
    50
    = a
    49
    + a
    48

    = (a
    48
    + a
    47
    ) + (a
    47
    + a
    46
    )

    = (a
    47
    + a
    46
    ) + (a
    46
    + a
    45
    ) + (a
    46
    + a
    45
    ) + (a
    45
    + a
    44
    )

    = …


    - 重複した計算を上手く記憶しておくことで速くできそう

    View Slide

  13. 計算量の例
    13
    - 途中計算を記憶しておく実装


    View Slide

  14. 計算量の例
    14
    - 途中計算を記憶しておく実装




    - 計算時間

    - a
    40
    : ≒ 1ms

    - a
    100
    : ≒ 1ms


    - ちなみにこういうアルゴリズムを総称して動的計画法(DP)という

    View Slide

  15. エンジニアの視点から
    15
    - 競プロをやることの利点


    View Slide

  16. エンジニアの視点から
    16
    - 競プロをやることの利点

    - 処理を軽くすることに目が向きやすい

    View Slide

  17. エンジニアの視点から
    17
    - 例)


    View Slide

  18. エンジニアの視点から
    18
    - ナイーブにやる



    - 二重ループは改善できそう


    View Slide

  19. エンジニアの視点から
    19
    - 連想配列を使う






    - 二重ループが解消できる


    View Slide

  20. まとめ
    20
    - 競プロでは、計算方法自体はすぐわかるけど、

    それを現実的な時間で計算できるかが求められる


    - 普段の実装でも、細かい計算量の削減に目が行き届くようになる

    View Slide

  21. 21

    View Slide