noip2007提高組題解

2022-05-18 12:39:30 字數 1617 閱讀 3139

第一題:統計數字

排序/平衡二叉樹

受上面這篇文章的影響,我沒有用快排,而是用了stl的multiset的count函式來統計出現次數。但事實證明stl的sort足以應付此題。另外的解法是用treap實現的名次樹,效率不及sort但高於multiset。

第二題:字串的展開

模擬

雖然是模擬題但是可惜沒有1次ac。原因出在我沒有考慮到連續的兩個展開,比如:

1 1 1

a-c-e

展開後應該是:abcde。而我的策略是處理掉乙個「展開」操作後就馬上輸出前面的部分並刪除,這就導致輸出的結果是:abc-e。實際上應該保留後面的這個字元,以便作為另乙個展開操作的開頭。

第三題:矩陣取數遊戲

動態規劃、高精度

不得不承認我一開始確實想不到思路。看了網上的題解,發現主要是兩種方法:(以下描述均針對矩陣的每一行,最終結果即各行結果之和)

f(i, j) 表示在左邊取i個數、在右邊取j個數能得到的最大分數,則

f(i, j) = max

f(i, j) 表示從第i個格仔取到第j個格仔能得到的最大分數,則

f(i, j) = 2*max

其中第二種方法很巧妙地避開了高精度乘法,用2在狀態轉移的時候進行累乘。最後,高精度最好用加法 char 而不要用 string,兩者速度相差太明顯了(幾乎是超時與無壓力ac的區別)。

第四題:樹網的核

dfs

這道題目的特點是用大量的概念、定義來嚇唬人。

幾乎所有網路上的題解都說「只要對於一條直徑進行計算即可」,但是我想不明白。那就姑且承認這個結論。

首先,在樹上找到一條直徑。方法如下:

從樹上任意一點 u 出發,找到距其最遠的點 v;從 v 出發,找到距其最遠的點 x。

路徑 v -> x 即樹網的直徑。(證明見注釋)

然後找核。列舉直徑上的每個點,向單方向擴充套件出一段長度小於等於 s 的「核」,然後對於「核」上的每乙個結點,求出它到每個點的最短距離。在所有這些最短距離中找出最大值,這個值就是現在這個「核」的偏心距。找到所有偏心距中最小的乙個即可。

注釋:關於用兩次遍歷求出直徑的方法的正確性,證明如下:

首先,我們要證明從樹上任意一點 u 出發找到的最遠結點 v 必然是直徑的乙個端點。如果能夠得到這個結論,整個方法的正確性就顯然了。

先假設我們找到的 v 結點不是直徑的端點。

我們可以證明 u->v 必然與直徑 a->b 有交叉點。

如果沒有交叉點,任選兩條路徑的兩個端點相連就能得到一條更長的路徑。如下圖。

所以,既然有交叉點,設交叉點為 x,由 u->v 大於 u->a,可以推出 x->v 大於 x->a,那麼路徑 v->x->b 比 a->b 更長,a->b 不是直徑,矛盾。

所以 v 只能是直徑的端點。

NOIP2007提高組題解

考察知識 快速排序,map的基本操作 演算法難度 xx x 實現難度 xx x 分析 如果用快排的話,要用分治思想,難度稍微大一些,用map就是基本操作,難度不大 如果追求速度可以寫乙個快速輸入函式,但是注意輸入是否有負數 map版 含快速輸入 include include includeusin...

NOIP2007 提高組 題解

2007 提高組題解 第一題 一開始還想是不是要用雜湊表儲存呢,但仔細想了一會兒,那個資料量20w 用個快排序,時間是能過的。所以這道題用個stl的快排,再乙個迴圈統計個數就ok了。但最後交上去評測時0分,很尷尬。就是我在資料初始化時從一開始計數,我迴圈又從一開始,多算了一次,爆掉了。改了就100了...

NOIP2007提高組 樹網的核

noip2007提高組試題4。設 t v,e,w 是乙個無圈且連通的無向圖 也稱無根樹 每條邊帶有正整數的權,我們稱 t 為樹網 treenetwork 其中 v,e 分別表示結點與邊的集合,w 表示各邊長度的集合,並設 t 有 n 個結點。路徑 樹網中任何兩個結點 a,b 都存在唯一的一條簡單路徑...