這一年的前三題雖然難度不高,但是第二題極為繁瑣,想在考場上用較短的時間拿到第二題的分數難上加難。所以必須要調整策略,爭取拿其他三題的分數。第四題是比較普通的搜尋題,分數比較好拿,但是很容易想成樹形dp,就只能拿30~50分。
第一題:神經網路
模擬
有幾個注意點:
輸入層(即第一層)的結點的u(閾值)是沒有用的;
題目說輸出「最後狀態非零的輸出層神經元狀態」,但實際上輸出的是狀態大於0的值。
由於沒有注意到神經元只有在興奮狀態時才會向下傳送訊號,所以wa了1次。
第二題:偵探推理
模擬+列舉
我用的是比較笨拙的列舉策略:列舉哪些人說的是真話,哪些人說的是假話。
但更好的策略是:列舉誰是**。
繁瑣但不難,注意幾個點:
**只有乙個。那麼當只有乙個人且根據其話語無法推出是不是**時,其必然是**;
程式無法確定出**時可能是cannot determine,也可能是impossible,需要根據具體情境進行特殊處理。
花了很久才ac,與我的解題策略的選擇有莫大的關係。
第三題:加分二叉樹
動態規劃
很可惜做這道題在最開始的時候就想錯了,用貪心寫了一下,結果只過了1個點。應該說很多題目都是看似可以用貪心做但其實應該用動規(01揹包、石子合併等),這也是以後做題時的乙個注意點。
首先題目要求構造的樹的中序遍歷要有序,其實也就是由序列(1,2,…,n)構造出一棵二叉排序樹:選擇某個數字為根,把比它小的數字安排在它的左子樹,把比它大的數安排在它的右子樹,遞迴進行。
問題就是如何選擇根?
由題意可以看出,乙個數字的層次越深,它對整個二叉樹的加分的「貢獻」就越大,所以我想到的是貪心策略:將權值大的結點盡量安排在樹的葉端,即把權值最小的結點作為根。
這樣的貪心策略看似正確而且也符合樣例資料,但其實是錯誤的。根據上面所述,如果按照貪心策略構建出這樣的樹,那麼最理想的狀態是結點的權值與深度應該成正比(但是為了滿足bst的性質需要進行調整)。如果每次將權值最小的結點作為根,往往達不到這樣的狀態。比如:結點1,2,…,n對應的權值為99,2,2,…,2,則權值最大的結點1會被安排在權值最小的結點2的左子樹而且成為葉子結點,這樣分配明顯是很不合理的。
正確的策略應該是採用動態規劃,列舉需要用哪個結點作為根。
f(l, r) 表示將區間 [l, r] 構建成加分二叉樹所得的最大加分(區間 [l, r] 表示結點編號),則
f(l, r) = max
邊界條件:f(l, r) = 1 (l > r)
時間複雜度:o(n^3)
第四題:傳染病控制
搜尋
一開始以為是動規,但實際上有後效性。
按層進行搜尋,列舉哪一條邊需要被截斷,將已被阻斷的子樹上的結點做標記,然後搜尋下一層。
有乙個普通的剪枝:如果當前感染人數大於已找到的最小人數則回溯。
但是很奇怪的是只有乙個點過不了,而且答案只和標準答案相差1,實在無力除錯,所以就針對特殊情況打表騙了個ac。
經驗教訓:
要總結平時遇到的容易想錯演算法的題目(動規想成貪心、搜尋想成動規),尋找其特點與規律;
多做題目就會對各種演算法適用的題型有更清晰的認識和更深刻的理解,幫助解題;
不能輕視模擬題,有些模擬題題目較複雜,要有提煉題目的能力。
NOIP2023年普及組題解
這是第一題 首先,在做題之前要注意兩個地方 e 不一定出現在文字的末尾,也不一定出現在某行的末尾 比賽必須要領先2個球才能獲勝,11 10的比分是不存在的 好了,廢話不多說,直接上 include include include include include using namespace std...
NOIP2003提高組 神經網路
題目 洛谷p1038 vijos p1105 codevs1088。題目大意 給你乙個有向圖,每個非源點i的值的計算方式為 c i sum limits w c j u i 求每個匯點 沒有出邊的點 的值c。解題思路 首先一遍dfs找出所有匯點,然後bfs計算即可。注意源點不需要減去u。c code...
noip2003普及組 棧
棧 組合計數,卡特蘭數 o n 2 o n 2 o n2 首先任何一種合法的入棧 出棧操作序列都可以得到乙個不同的1 n的排列,因此可以得到的排列總數等於合法入棧 出棧操作序列的個數。該問題等價於求第n nn項cat alan catalan catala n數。在本題中我們使用公式 cnm cn ...