JOI Kakisemi Contest 2019:D - ふたつのケーキ
問題
https://www.hackerrank.com/contests/joi-kakisemi-contest-2019/challenges/challenge-2155
S 人の人と 2 種類のケーキがある.イチゴケーキは N 個に分かれていて,ショートケーキ M 個に分かれている.イチゴケーキに関しては, S 人に分ける個数が決まっている.ここで,各人について,2 種類のケーキを取る個数の差の 2 乗の和を最小化する問題.
解法
小課題1
S = 2 より人は 2 人しかない.よって,イチゴケーキを分ける境目の個数の近くの切れ目 2 通りを試せばよい.(x / N) >= (y / M) の一次不等式を解けば四則演算のみで解ける.
小課題2
N, M <= 50 より DP を考える.
dp[何人目まで配分を決めたか][ショートケーキを既に配分した個数] とおくと,O(S * M^2) となる.高速化すると O(SM) などにすることができるが,後の小課題にはつながらない.
小課題3
各人について誤差の 2 乗は x 軸を N, y 軸を M とする二次元平面状で下に凸の放物線になる.この放物線の傾きは単調増加なので priority_queue などで O(MlogS) で求められる.
小課題4
ギリギリ (B_i / M) <= (A_i / N) であるような B_i を求めればよい.これは誤差をソートして計算すればよく,小課題3より O(SlogS).
また,微分係数を二分探索しても解くことができる.