Closed6
EDPC X Tower
EDPC X Tower 考察ノート
問題文要約
価値の総和が最大になるようにブロックを積んでください。
1 \le N \le 10^3 1 \le w_i, s_i, \le 10^4 1 \le v_i \le 10^9
考察
- ブロックを積んでしまえば、積む順番によらず重さと価値の総和が決まる。上から積んでいくDP?
- 耐久値が小さいものほど上に積みたい。同時に、軽いものほど上に積みたい。両方のバランスをとる必要がある。
- 積む順番を決めてナップザックDP。ナイーブには計算量が
で話にならない。順列はダメ。O(N!\times \sum_i s_i) - 2つのブロックを使える場合にどちらが上にあるか決まる「積むための十分条件」があれば、ナップザックDPできる。正確には、一方が他方より常に上にあるようにできればよい。
\dag 真の積み方\dag があると思ってみる
- 局所的に考える。
とかが成り立つときは明らか。いつも都合よく成り立つはずがない。s_i \ge w_j \land s_j < w_i - 一般化して「塔の上部の重さが
のとき、ブロックW をどう積むのが良いか」考えてみる。i, j - 正順に積むとき、
が成り立つ。逆順ならW\le s_i, W+w_i\le s_j W\le s_j, W+w_j\le s_i - 整理すると、
W\le \min(s_i, s_j-w_i) \lor W\le \min(s_j, s_i-w_j)
-
がでかい方が良い。W
-
のとき、耐荷重が大きい方が上。s_i\le s_j-w_i \land s_j \le s_i-w_j -
のとき、s_i\ge s_j-w_i \land s_j \le s_i-w_j が上。j -
のとき、s_i\le s_j-w_i \land s_j \ge s_i-w_j が上。i -
のとき、s_i\ge s_j-w_i \land s_j \ge s_i-w_j が小さい方が上。同じならどっちでもよい。s+w
-
が小さい方が上?s+w
-
よりs_i \le s_j \Rarr s_i+w_i \le s_j \le s_j+w_j \land s_j+w_j \le s_i \le s_i+w_i となり、s_i=s_j, w_i=w_j=0 に矛盾。w\ge 1 が許される場合、重さが変わらないのでどっちでもいい。w=0 -
よりs_j+w_j \le s_i < s_i+w_i が小さい方が上。s+w -
よりs_i+w_i \le s_j < s_j+w_j が小さい方が上。s+w -
が小さい方が上。s+w
-
真の積み方\dag は実在する!\dag
結論
このスクラップは5ヶ月前にクローズされました