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

Pythonで競技プログラミングハンズオン

amacbee
November 27, 2016

 Pythonで競技プログラミングハンズオン

PyLadies Tokyo Meetup #16の資料

amacbee

November 27, 2016
Tweet

More Decks by amacbee

Other Decks in Technology

Transcript

  1. 本日やること 競技プログラミングにチャレンジします! 競技プログラミングでは、 参加者全員に同一の 課題が出題され、 より早く、 与えられた要求を 満足するプログラムを正確に記述することを競 う。 by

    Wikipedia 到達したいゴー ル 参加にあたり知っていると便利なTips を理解 一連の流れを理解して, ひとりでもコンテスト に参加出来るようになる 3
  2. 1. 入力の受け取りかた input() を利用して簡単に受け取ることが出来る 入力として受け取りたい数値 1 # a 2.0 #

    b 3 4 5 # c Python 側での処理 a = int(input()) b = float(input()) c = [int(x) for x in input().split()] 7
  3. [ 閑話] Python 2 で input() を使わない Python 2 の

    input() は入力された文字列をそのまま実 行( eval() ) してしまうので非常に危険 --> raw_input() を代わりに利用する a = raw_input() # for Python 2.* Python 3 では raw_input() は廃止され, input() が raw_input() の動作をする. みんなPython 3 を使いま しょう 8
  4. 2. 出力のしかた print() 出力を使う # 入力 a = input() b

    = input() # 出力 c = 0 ... ... print(c) 10
  5. [ 例題] 総和を求めるプログラム スペー ス区切りの数値を与えられたら, その総和を出 力する calculator.py を作成しなさい $

    python calculator.py 1 2 3 4 5 15 ↓ # calculator.py dat = [int(x) for x in input().split()] print(sum(dat)) 12
  6. 3. 制約を満たしているかの否かの確 かめかた(2/7) プログラムの実行時間の計測には, time モジュー ル の time.time() 関数を利用する

    実行開始時間と終了時間の差分を見ている import time start = time.time() dat = [int(x) for x in input().split()] print(sum(dat)) print('{} [ms]'.format(1000 * (time.time() - start))) 15
  7. 3. 制約を満たしているかの否かの確 かめかた(3/7) input.txt 1 2 3 4 5 実行結果

    $ python calculator.py < input.txt 15 0.3211498260498047 [ms] ※ 連続で実行する場合は __pycache__ を削除すること 16
  8. 3. 制約を満たしているかの否かの確か めかた(4/7) Unix 環境であれば time コマンドも便利 $ time python

    calculator.py < input.txt 15 python calculator.py < input.txt 0.10s user 0.08s system 87% cpu 0.201 total 17
  9. 3. 制約を満たしているかの否かの確か めかた(5/7) メモリの使用量の計測には memory_profiler を使う memory_profiler は pip で簡単に導入できる

    $ pip install psutil memory_profiler メモリ使用量を計測したい関数に, @profile のデコ レー タをつけるだけでプロファイリングが行われる 18
  10. 3. 制約を満たしているかの否かの確か めかた(6/7) python -m memory_profiler 分析したいPython ファイル という 形式で実行すると,

    プロファイリングが行われる $ python -m memory_profiler calculator.py < input.txt 15 Filename: calculator.py Line # Mem usage Increment Line Contents ================================================ 3 22.781 MiB 0.000 MiB @profile 4 def main(): 5 22.785 MiB 0.004 MiB print(sum([int(x) for x i 19
  11. 3. 制約を満たしているかの否かの確か めかた(7/7) プログラムの実行時間 time.time() (time モジュー ル) Unix のtime

    コマンド メモリの使用量 @pro le (memory_pro ler モジュー ル) python -m memory_pro ler 20
  12. No.5 数字のブロック Ellen は数字のブロックで遊ぼうとしている。 数字が書かれているブロックはそれぞれ高さ1 で幅は W である。 それらのブロックを高さ1, 幅L

    の大きな箱 の中に入れる。 Ellen は大きな箱にどれだけブロックがたくさん入る か気になったが。 組み合わせがたくさんあって大変な ことに気づいて、 すぐに夜になってしまいそうであ る。 あなたは、 代わりに大きな箱に最大何個のブロックが 入るかを求めてください。 制限:1 ケー ス 5.000 秒 / メモリ制限 512 MB i 23
  13. 入力形式 L N W W W ... W 1 行目:

    箱の幅 L(1≤L≤10000) 2 行目: ブロックの数 N (1≤N≤10000) 3 行目: 各ブロックの幅 W (1≤Wi≤L) が半角スペー ス区切りになっている 1 2 3 N i 24
  14. 回答サンプル # 入力を受け取る L = int(input()) _ = input() blocks

    = [int(block) for block in input().split()] # boxes を小さい順に並び替えて,L からひいていく # L がマイナスになったらそのときのidx を出力 answer = 0 for block in sorted(blocks): L = L - block if L >= 0: answer += 1 else: break print(answer) 28
  15. 問題にチャレンジ! 以下の問題にチャレンジしてみましょう 早く解き終わった方は別の問題にもチャレンジ! No.46 はじめのn 歩 No.207 世界のなんとか No.56 消費税

    No.47 ポケットを叩くとビスケットが2倍 問題ペー ジのURL: {number} の部分に問題No. を入れて下さい http://yukicoder.me/problems/no/{number} 29
  16. [ 閑話] Python の速度問題 C++ 言語と比較して, プログラムの実行時間やメモ リ使用量が制限されてしまう 実行時間が1 秒の場合C++

    なら10 ルー プでも耐 えられるが,Python だと10 ルー プでも厳しめ 要素あたりのメモリ使用量が多い 参考: http://qiita.com/lethe2211/items/38303f4120bfd96 3679a 7 6 30