mini notes

競技プログラミングの解法メモを残していきます。

ABC227 D - Project Planning

問題:D - Project Planning

解答:Submission #27305078 - KEYENCE Programming Contest 2021 (AtCoder Beginner Contest 227)

解法:何となく部署の人数が多い方から一人ずつ集めるとよさそうだが、a[i]を減らしていって新たにタイが発生するところからわかりにくくなる。

実はプロジェクトの数を決め打つにぶたんが使える。プロジェクト数をxとすると、最低限必要な人数はK * xである。各部署から集められる人数について、1つの部署からx+1人を集めてしまうとかならずその部署のひとがかぶるプロジェクトが出てくるため、上限はx人となる。よって、各部署から集められる人数の合計はΣmin(a[i], x)である。したがって、Σmin(a[i], x) ≧ K * xでなければ、そもそもプロジェクトの人数を集めることができない。

実は、Σmin(a[i], x) ≧ K * xであれば、かならず部署がかぶらずに人を割り当てることが出来る。プロジェクト1, 2, ..., xに対し、部署1からmin(a[1], x)人、部署2からmin(a[2], x)人、...と順番に割り当ててゆく。すると、仮に一つの部署から最大x人集まったとして、最初の人の割当プロジェクトをkとすると、各人の割当プロジェクトk, k+1, ..., x, 1, 2, ..., k-1となり、重なることはない。