なが月・10日目

10日目

午前

昨日に引き続きABC137D。Python3での1st AC解はこのような流れになっている:

  1. 入力A, Bを受け、「今すぐ働いても支給が間に合わない仕事(A > M)」なら無視する。そうでなければ仕事候補リストに(A, B)を入れる。
  2. 【入力終了】
  3. 支給が一番早いものを後でpopしたいので、支給が遅い方から順に仕事候補リストをソートする。
  4. 優先度付きキューを用意する。
  5. i = 1, 2, ... Mについて、以下の一連の処理を行っていく。
    • 仕事候補リストのうち最も支給の早いものを見て、期限のi日前の日に働いて支給が間に合うなら取り出して優先度付きキューに賃金の正負を反転させたものを入れる。(すなわちこの優先度付きキューは「この日やって間に合う仕事の賃金を符号反転したもの一覧(自動ソート機能付き)」である。Pythonのheapqは値が最小のものがheappopで取り出せるようになっているため、賃金が最大のものを得たい場合は負にしなければならない)この作業を、支給が間に合わない仕事に行き当たるまで(while)続ける。
    • 「この日やって間に合う仕事の賃金を符号反転したもの一覧」から最小のもの(=符号を元に戻せば最大)を取り出し、正負を元に戻してその日の仕事とする。

しかし考えてみれば仕事候補はタプルからなるリストでなくてもよい。辞書型のキーを支給所要日数とし、値を賃金のリストとすればよい。そうすれば最大10^5もの要素を持つリストをソートする必要はないし、whileではなくforで多少早く処理できる。結果として以下のコードに至った。1st AC解から32%程度高速になった(358ms→270ms)。

午後

C言語入門が終わってしまったので来学期の講義資料を見て教科書類を調査した。Windowsでも演習ができる教科書を借りることができるのは夏季閉室のためしばらく後になることが分かったので、明日からしばらくはC++に触れることにする(http://www.ohshiro.tuis.ac.jp/~ohshiro/gamesoft/cpp01/index.html)。C++の包括的な演習形式サイトがあまり見当たらなかったので、その後は教科書とともにC++実践プログラミングを借りてくることにしたい。Effective Modern C++は...そこまで要るかなあ...UE4C++書く予定はないし...

またDCCツール勉強時間を何に充てるかも考えたが、Unity Learn PremiumはUnity Plusの契約期間中しかアクセスできないので、Oculus Startメンバー特典として活用しない手はない。Design, Art, Fundamentalsコースをやっていこうと思う(有料コンテンツなので内容はほとんど書けない)。全部で93時間ほどある。休日の2+1時間を充てれば31日間、8週間でようやく終わることになりそうだ。