1. 程式人生 > 其它 >【構造訓練 2】【糊題】 IPSC2012 Partitioning containers

【構造訓練 2】【糊題】 IPSC2012 Partitioning containers

構造訓練2!

本題出了比較曲折的問題
此題我找不到提交地址

題面

題解

以下做法不保證正確,即使有嚴謹證明(見後寄
刪除最大值這種做法是不支援\(O(1)\)空間的,我們考慮直接加,能放第一個就放,不能就第二個,再不能就扔。

證明1:

結論1:假如我要把一個大小為\(S\)的空間分成兩部分,使其都不能放下一個大小為\(x\)的塊,那麼分成兩個\(\frac s2\)顯然最優。

考慮現在出現了一個放不進去的塊, 設其大小為\(x\),設還沒有放進去的所有塊大小和為\(s\),那麼有\(s \leq x\), 因為如果\(s > x \to s+x>2x\) ,那麼兩個容器剩餘空間和顯然大於\(2x\)

,由於結論1,\(x\)顯然可以放入,不成立。

\(x=ys(y\geq1)\),那麼

\[\frac{x+s}{2} = \frac{s+ys}{2} > s \]

所以扔掉\(x\)後,\(s\)顯然可以放入,證畢。

證明2:

受lyf大佬的啟發,這裡有一個更妙的證明。
假如我們有一個塊放不下了,我們把它放第一個會多出來一點,那麼假如我們把多出來的一點切下來放到第二個,那麼肯定放得下,由於第一個已經滿了,所以還沒放的所有塊肯定恰好能放進第二個,所以我們把當前這個塊扔了,後面的塊一定放得下。


後寄

題解說我這種做法是錯的,有圖為證。

在與機房dalao討論半天之後,終於不知道哪裡錯了。

就當是對的了!

這證明真的不能在錯了吧?