1. 程式人生 > >NOI導刊提高二

NOI導刊提高二

mat http 就是 收費 方塊 inline 然而 部分 處理

開燈

題目大意

對編號為\([i \times a]\)的燈進行操作,找出操作數為奇數的那一個

題目分析

難度入門
因為看到操作數為奇數,因此直接進行位運算,做亦或和

打磚塊

題目分析

第一眼看上去像動歸,但是有以下兩個問題難以解決:

  1. 狀態怎麽表示
  2. 獎勵子彈怎麽處理
    因為我比較弱,本來想寫個\(50pts\),結果夢想直接破滅
    其實下來看這50分超級好拿,我走入了要表示現階段前面所有方塊狀態的誤區,才沒有得到這暴力分

如果不考慮獎勵子彈,那麽我們用\(f[i][j]\)表示前\(i\)列使用\(j\)個子彈的最大得分
這個dp就非常的簡單:\[f[i][j] = max(f[i - 1][j], f[i - 1][j - k] + s[i][k]\]

那麽我們再來考慮如果有獎勵子彈的情況:
我們有一個很簡單的做法:那就是如果這個有獎勵子彈,這個磚塊就相當於是免費的,我們能打就打
我們可以嘗試這個更新到下面的非免費磚塊,然後一樣的dp

然而這個做法是錯誤的,考慮一下如果後面的如果在後面的序列中可以“打而不用完",然後最後再回來打這個,就會有更優的解
由於這樣的話會破壞無後效性這一要素,我們考慮在這種情況進行分類討論。

我們用\(by[i][j]\)表示對前\(i\)列磚塊打\(j\)發子彈,且最後一發子彈不是對著前\(i\)列發出的最大值;\(bn[i][j]\)表示對前\(i\)列磚塊打\(j\)發子彈,且最後一發子彈是對著前\(i\)

列發出的最大值,然後我們特判一下最後的一發是不是在第\(i\)列打出就行了。

長方形

這道題沒什麽價值,而且結題部分要寫很長,我直接粘一下題解的鏈接
https://www.luogu.org/problemnew/solution/P1950

收費站

題目大意

給定一個無向圖,求\(u\)\(v\)中,在總長不超過\(s\)的情況下,在所有點中\(f\)的最大值最小是多少

題目解析

因為求的是最大值最小,我們二分一下這個值,然後小於這個值的邊我們就刪除掉,跑一下最短路就可以了
難度大概是提高-
不是很熟悉二分和鏈式前向星的模板,所以調試略微久了點,最終二分還寫掛了,只有\(80pts\)

NOI導刊提高二