人工知能と競プロやってくブログ

深層学習・機械学習・AI・atcoder・競技プログラミングについて調べてやってみたことをまとめるブログです

AtCoder Beginner Contest 204 D問題 [ D - Cooking ] をPythonで解いてみる。割り算の切り上げ間違いにハマる(正解率33.67%)

問題概要

N 個の料理があり,それぞれ作るためにオーブンを使う時間はTiである。2つのオーブンを用いてすべての料理を作るのにかかる時間は最短何分か。
1≤N≤100
0≤Ti≤103

atcoder.jp

実装方針

公式解説の説明がわかりやすい。

atcoder.jp

2つのオーブンのどちらに割り当てるかによって料理を 2つの集合に分けることを考えると、問題は「N品の料理を 2つの集合に分け、それぞれ作るのにかかる時間の合計の最大値を最小化せよ」と読み替えることが出来ます。

DPで部分和問題として解く

「T1,…,TNからいくつか選んだ和であって、全Tの合計値/2以上の最小値は?」という方針で、部分和の問題として解く。
DPの部分和を解くコードが、そのまま適応できる。

最初書いたコードの答えを求めるパートの「全Tの合計値/2以上の最小値」の割り算計算が間違っててハマり。
int(TMAX // 2)+1
と書いたが、これだと割り切れる場合にも1足されてしまう。
math.ceil(TMAX/2)
でAC。

はまやんさんのCコードをPythonにコンバートしたコード

あと、はまやんさんの解説にのってるCコードをPythonに書きかえたモノも書いたので、のせておきます。

D - Cookingの正解率

2970 / 8819 = 33.67%

結構、答えられてるよなー。
みんな良くわかるな。

参考

kanpurin.hatenablog.com

wakabame.hatenablog.com

blog.hamayanhamayan.com