ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ABC056 D - No Need

問題
提出コード
サンプル3についてなんとなく考えると、不必要なカードは2,3,4の3つであり、これはすべてのカードの中で小さい3つを選ぶ形になります。
ということで、なんとなく、昇順にソートすると前の方が不必要、後ろの方が必要なカードになりそうなことがわかります。このことが正しいことを示します。
今、a_iが必要なカードだったとします。すると、次の条件を満たす、i番目のカードを含む部分集合Sが存在します。

  • Sに含まれるカードの数の総和はK以上で、そこからa_iを引いたものがK未満になる

このとき、Sに含まれる、a_i以上の数字のカードはすべて必要なカードになります。なぜなら、Sの総和からa_iを引いたものがK未満になるので、a_i以上の数字を引いた際ももちろんK未満になります。
そして、Sに含まれない、a_i以上の数字が書かれているカードは、a_iとそのカードを置き換えてあげると、Sの総和がK以上、そこから置き換えたカードの数字を引いてあげるとK未満になります。

ということで、aを昇順でソートしてあげれば、前半が不必要なカード、後半が必要なカードに綺麗にわかれます。
とすると、二分探索で、不必要なカードのうち最大のものの場所がわかれば、答えをすぐに求めることができます。
あとは、i番目のカードが必要であるかどうかを調べればいいのですが、DPを用いて求めることができます。
i番目のカードを含む部分集合Sについて、その総和がK以上K+a_i未満になるような部分集合がつくれた場合、i番目のカードは必要なカードになります。これを利用します。
dp[j][l] = j番目までのカードを用いて、総和がlとなるような部分集合をつくれるかどうか
としておけば、i番目のカードを必ず使用するように工夫しつつこのDPをとくことで(あらかじめ足しておいて、i番目だけDPの遷移をスキップすればよいです)、
dp[n][p] (ただしp K \leqq p \lt K + a_i を満たす)
の部分で、作成できるという情報が存在していれば、i番目のカードは必要なカードになります。
とここで、a_i10^{9}まで制約があるのですが、K \leqq a_iとなるi番目のカードはすべて必要なカードとなるので、dp[i][l]lの部分は、2×Kだけ用意しておけば大丈夫です。なぜなら、そしてi番目のカード1枚の部分集合はどちらもよい集合となるため、i番目のカードを捨てると、これは空集合となり、よい集合ではなくなってしまいます。よって、K \leqq a_iとなるi番目のカードはDPをせずとも必要なカードになります。

ということで、このDPを解きつつ二分探索することで、この問題の答えをO(NKlogN)で求めることができます。