Official

B - CatCoder Knapsack Contest Editorial by snuke


二分探索し「\(n\) 回開催できるか」の判定問題を解きます。

\(X \lt Y\) の場合

CKC \(1\) 回あたり \((1,2)\)\((2,1)\) よりちょうど \(Y-X\) 個多く使う必要があります。適切に前処理を行い、\(X=Y\) の場合に帰着します。

\(X \gt Y\) の場合も同様)

\(X=Y\) の場合

\((1,2),(2,1)\) は同じ個数使う必要があるため、\(1,2,3\) を使って \(X\)\(n\) 個作ることが出来るかを判定すればよいです。

まず、\(1,2\) をそれぞれ \(A_1,A_2\) 個使って多重集合 \(S\) を作ることが出来るかの判定問題は以下のように解くことが出来ます。

  • まず、\(S\) 内の奇数から \(1\) を引く。その後合計が足りているか(\(\sum_{x \in S}x \le A_1+2A_2\) かどうか)を判定する。

これを踏まえると、\(3\) も使える場合は、奇数が \(A_1\) 個以下になるようにしながら可能な限り多くの \(3\) を使うことが最善であることが分かります。

\(3\) は以下のような貪欲法で使っていくと良いです

  • \(X=1\)\(3\) は使えない。\(1,2\) のみ使える場合に帰着。
  • \(X\) が奇数:奇数に \(3\)\(1\) 個ずつ使う。
    • \(3\) が足りない場合:\(1,2\) のみ使える場合に帰着。
    • \(3\) が足りる場合:\(X\) が偶数の場合に帰着。
  • \(X\) が偶数:
    • \(3\)\(2\) 個ずつ、使えるだけ使う。
    • その後、\(3\)\(1\) 個だけ使うことを \(A_1\) 回以下の範囲で可能な限り行う。

posted:
last update: