Official

O - コンピュータ/Computer Editorial by leaf1415


一般性を失わず、\(B_1 < B_2 < \cdots < B_N\) と仮定します。

なぜ $B_1 < B_2 < \cdots < B_N$ と仮定して良いか
$B_i \leq \max\{B_1, B_2, \ldots, B_{i-1}\}$ が成り立つとき、 高橋君が $i-1$ 日目までの仕事をすべてこなすことができたなら、 高橋君は $i$ 日目の夜にはすでに価格 $B_i$ 以上のコンピュータを持っていますから、 $i$ 日目の仕事も必ずこなすことができます。 よって、「 $i$ 日目の夜に $B_i$ 円以上のコンピュータを持っていなければならない」という条件は、 $B_i > \max\{B_1, B_2, \ldots, B_{i-1}\}$ となる $i$ についてのみ考慮すれば十分です。 ここで、$B_i > \max\{B_1, B_2, \ldots, B_{i-1}\}$ を満たす $i$ を小さい方から順に、 $p_0( = 0), p_1, p_2, \ldots, p_{N'}$とおき、 $i= 1, 2, \ldots, N'$ について $A'_i$ と $B'_i$ を、 $A'_i = \sum_{k=p_{i-1}+1}^{p_i} A_k$ および $B'_i = B_{p_i}$ で定めます。 このとき、入力として与えられた $N$ および数列 $A$ と数列 $B$ に対して本問題を解く代わりに、$N'$ および数列 $A'$ と数列 $B'$ に対して本問題を解けば、(高橋君がすべての仕事をこなせる場合は)その答えに $\sum_{k = i_{N'}+1}^N A_i$ を足したものが、元の $N$, $A$, $B$ に対する答えとなります。 数列 $B'$ に関して、 $B'_1 < B'_2 < \cdots < B'_{N'}$ が成り立つので、 初めから $B_1 < B_2 < \cdots < B_N$ を満たす場合にのみ本問題を解ければ十分です。


便宜上、\(B_0 = 0\)とし、初期状態では高橋君は価格 \(B_0\) 円のコンピュータを持っていると考えます。

動的計画法でこの問題を解きます。
明らかに、\(B_1, B_2, \ldots, B_N\) のいずれとも価格が一致しないコンピュータを買う必要はありません。
そこで、\(\mathrm{dp}[i]\) を「価格 \(B_i\) 円のコンピュータを持った状態になるまでに支出する総額の最小値」と定義します。
高橋君が全ての仕事をこなすことができる場合、 \((\sum_{k=1}^N A_i - \mathrm{dp}[N])\) 円がこの問題の答えになります。

ここで、高橋君が価格 \(B_i\) 円のコンピュータを持っており、それまでの支出総額が \(\mathrm{dp}[i]\) 円のとき、 次に高橋君が購入することができるコンピュータの最大価格はいくらになるか考えます。 仮定 \(B_i < B_{i+1}\) より、高橋君は少なくとも \(i+1\) 日目の昼までには、 現在所有する価格 \(B_i\) 円のコンピュータを破棄して新しいコンピュータを購入する必要があります。 \(i+1\) 日目の昼までに高橋君が得る収入の合計は、\(\sum_{k=1} ^ {i+1} A_k\) 円です。 高橋君は、そのうちの \(\mathrm{dp}[i]\) 円をすでに消費していますから、 高橋君が次のコンピュータの購入に当てることが出来る金額の上限は \((\sum_{k=1} ^ {i+1} A_k - \mathrm{dp}[i])\) 円です。

よって、 \(B_i \leq \sum_{k=1} ^ {j+1} A_k - \mathrm{dp}[j]\) は、価格 \(B_j\) 円のコンピュータを持つ状態から、価格 \(B_i\) 円のコンピュータを持つ状態に遷移できる必要十分条件であり、
\(\mathrm{dp[i]} = \min\{\mathrm{dp}[j] + B_i | B_i \leq \sum_{k=1} ^ {j+1} A_k - \mathrm{dp}[j]\}\)
が成り立ちます。

この漸化式を用いて、\(i = 1, 2, \ldots, N\) の順番に \(\mathrm{dp}[i]\) の値を計算することができます。 ただし、\( B_i \leq \sum_{k=1} ^ {j+1} A_k - \mathrm{dp}[j]\) を満たす \(j\) が存在しない場合は、便宜上 \(\mathrm{dp[i]} = \infty\) とします。
その結果、\(\mathrm{dp}[N] = \infty\) の場合は、高橋君はすべての仕事をこなすことができないため \(-1\) を出力し、 \(\mathrm{dp}[N] < \infty\) の場合は、\((\sum_{k=1}^N A_k - \mathrm{dp}[N])\) が問題の答えとなるためこれを出力します。

\(\mathrm{dp}[1], \mathrm{dp}[2], \ldots, \mathrm{dp}[N]\) を計算する上記の過程において、\(B_i \leq \sum_{k=1} ^ {j+1} A_k - \mathrm{dp}[j]\) を満たすすべての \(j\) についての \(\mathrm{dp}[j] + B_i\) の値を、多重集合として優先度付きキューや平衡二分探索木などのデータ構造を用いて保持し、計算に活用することで、 \(\mathrm{O}(N \log N)\) 時間で本問題を解くことができます。

posted:
last update: