這道題並不是我想出來的。。是看了網上乙個程式然後自己yy出這個程式是幹什麼的。。
這裡再放我的**,其實和他的差不多,只是這樣方便看下文
然後大家看完了那篇文章之後如果沒懂(反正我當時是沒懂
這個程式首先對於原來的序列求出乙個解的下限,然後不斷的調整,直到得出可行解,
首先,初始解是乙個不斷下降的序列,而且每次下降的幅度都取到極限(也就是題目中的d值)。
(注意,在初始解中,最後乙個點的高度也是被改變了的。)那麼,我們可以很容易的證明,對於乙個可行解,每乙個點的高度對於初始解都是不下降的,因為只有這樣才能是它符合題意,同時我們需要把可行解的最後一項調整為原來的數才行。
首先,說明一下調整的規則。因為最終答案對於初始解一定是不下降的,所以我們的規則如果合理,可以使調整方向只向上不向下。
每次調整,我們都只從乙個數開始到最後乙個數都向上調同樣的高度,因為這樣可以保證我調整後使費用減小的前提下序列依然符合要求,即相鄰兩個數的差小於等於d。
接著解釋一下s的作用。s表示的時從當前這個數到最後乙個數中(當前解小於原數的個數)-(當前解大於原數的個數)。因為我們調整時是將這一段序列都往上調,所以乙個數比原解小,則對於它的調整會使改變量減少,即費用降低;否則,會使改變量增大,即費用公升高。
我 們在調整過程中,必須時刻保證相鄰的兩數相差不大於d,所以要特別的處理一些情況(詳見程式)。而且,在一次調整時,我們必須保證本來低於原數的當前解不 能超過原數,因為若一次改變中解從低於原數變為了高於原數,那麼它對於費用的改變量就不再是單調的了,所以我們每次的改變值不能超過min(原數-當前 解)【注意,這裡僅計算當前解小於原數的那些數】,然後,當我們把最後乙個數的解調整成了當前解,那麼就得出了答案。
現在,還存在乙個問題,就是得出的答案是否一定為最優解。
那麼,我們只需要要證明以下結論就可以了:
1.使序列中的一段區間上公升,不會使費用更小;
2.使序列中的一段區間下降,不會使費用更小。
首先證明第乙個結論:
對於一段區間,若它不上調只有兩個可能:
1.這段區間內的s值不為正數,那麼上調不會使解更優;
2. 這段區間隨一直到末尾的區間上調,但最後乙個解已到達原數,不能再上調。那麼,若是這一段區間繼續上調,則會使此區間最後乙個數與下乙個數的差值大於d, 因為在初始解中的差值是達到極限d的,切這段區間一直隨末尾上調,那麼它們直接的差並未減小,所以繼續上調此區間必定會是差值增大,不符合條件。
綜上所述,上調一段區間不會在符合題意的條件下使費用減小。
然後證第二個結論:
若可以使乙個區間下調,那麼它已經經過一段上調,因為初始解是保證不能下調的下限解。若這段區間下調,則可以看作原調整過程中的乙個逆過程,那麼使它下調不可能是費用減小,因為這不符合原演算法的規則。所以,下調一段區間也不會在符合題意的條件下使費用減小。
證畢。通過證明,我們可以知道,得到的解即為最優解,這個演算法是正確的。
通過分析,每次調整會使最少乙個數達到上界,所以演算法複雜度不超過o(n^2)。
這個問題得到了解決(雖然其實不是我解決的
HNOI2009 通往城堡之路
聽說公主被關押在城堡裡,彭大俠下定決心 不管一路上有多少坎坷,不管城堡中的看守有多少厲害,不管救了公主之後公主會不會再被抓走,不管公主是否漂亮 是否會鍾情於自己,他將義無反顧地朝著城堡前進。可是,通往城堡的路上出現了一些情況。抽象地說,假象地圖在二維平面的第一象限。在每個橫軸的x位置上有乙個高為hx...
BZOJ1484 HNOI2009 通往城堡之路
作者部落格 正解 貪心 解題報告 做這道題做的我也是醉了 本來是找仙人掌題目的,搜尋bzoj仙人掌 bzoj1484!看了一下題目,excuse me?這跟仙人掌有啥關係?上網一搜題解,都說的很含糊,做法都是乙個不知道怎麼證明正確性的貪心 窩這麼弱就記住這個演算法好了 考慮我先做出所有點能取到的下界...
HNOI2009 夢幻布丁
題意 n個布丁擺成一行,進行m次操作.每次將某個顏色的布丁全部變成另一種顏色的,然後再詢問當前一共有多少段顏色.例如顏色分別為1,2,2,1的四個布丁一共有3段顏色.對每個顏色的位置維護鍊錶。合併兩個顏色,連線鍊錶,統計貢獻。統計貢獻的複雜度是與鍊錶長度有關的。如果遍歷長度短的鍊錶那麼複雜度自然更小...