1. 程式人生 > >NOIP2018 復盤

NOIP2018 復盤

需要 inline spa flag 什麽 max 就是 貨幣 P20

NOIP2018 復盤

前言

在這裏立一個可能無法實現的flag:

把NOIP從古至今(luogu上有)的每一年都寫一篇復盤!!!

伏拉格綜合征開始了

在復盤就不講那些傷心的話了。

D1T1 鋪設道路

考試時居然不知道這道題是原題。。。

一共有兩種做法:

  1. 遞推/貪心。

    設一個數組\(f\),順序遍歷。是這麽更新的:

    \[f[i]=f[i-1]+max(0,a[i]-a[i-1])\]

    反正我沒做過原題想不出來

  2. 分治。

    弄一個遞歸的函數,暴力統計區間最小值,暴力區間減,再來一個遍歷找出斷點,把所有的答案加起來就完事了。

    但是據說這種做法是會被卡成\(O(n^2)\)的。但是幸好NOIP的數據沒卡。

    不然我就省四退役了

代碼:

D1T2 貨幣系統

最初的想法是在一個大一點的範圍內看看表示的會不會一樣多。

不知道為什麽就發現:只要看看能否表示出給你的所有貨幣。

從小到大排序,選到能表達出所有貨幣為止。

表示方法有兩種

  1. dfs暴力搞。

    暴力枚舉出每一個數前面乘的數,看看能否表達就是了。

    但是這種做法因為效率不高而只能搞80pts。

  2. dp背包方案。

    因為任何一種貨幣都能選到夠,所以這不就是完全背包嗎?

    所以使用完全背包,從能夠表達的狀態轉移到另一個狀態即可。

    同時,這個dp數組是可以循環利用的。如果每次枚舉選幾種貨幣的話會T掉。

    這個就是正解了。

代碼:

D1T3 賽道修建

待填。。。

D2T1 旅行

這道題讓我認識了什麽叫做基環樹!

這道題就是兩個部分分:\(m=n-1\)\(m=n\)

\(m=n-1\)部分明顯就是一棵樹,那需要看怎麽遍歷這棵樹才能得到答案。

仔細觀察可以發現:把所有的邊從小到大排序,然後從1節點開始遍歷即可。60pts到手!

剩下的\(m=n\)部分分就是重點了。

基環樹有這麽幾個性質:

  1. 基環樹斷了一條邊可能就是一棵樹。
  2. 基環樹有且只有一個環。

再看到數據範圍:\(1 \leq n \leq 5000\)

結合去年的i7 8700k,不由得讓你想到了\(n^2\)算法!

所以算法出來了:枚舉所有的邊,每次斷掉其中的一條邊,在新圖上面dfs,求出最小字典序的答案。

還想優化?先跑一遍tarjan的點雙,若一條邊的兩個端點屬於同個點雙即為環上的邊,在上面斷邊,會去掉那些不是樹的斷法。

在luogu上面這兩種做法開O2都是能過的。

加強版不會做

代碼:

D2T2 填數遊戲

待填。。。

D2T3 保衛王國

動態dp。這輩子都不可能學的。

NOIP2018 復盤