20190812B組

20190812B組

T1:100(0)

賽時:

這道題想到正解應該不難,只不過比例的地方要小心。

並且,要注意這題序列長度不超過10^9,所以要用long long

賽後:

貪心的思想,不難發現,如果序列前 i 個方塊 B 和 W 的比例和 B 和 W 在整個序列中的比例相同。

我們一定會把第 i 個方塊與第 i+1 個方塊分開來得到儘量多的分段數。

比較暴力的做法就是把序列打開,對於序列的每個位置 i 統計 1~i 中 B 和 W 的數量,時間複雜度是 O(L),其中 L 表示序列長度。

100%,我們可以先算出 B 和 W 在整個序列中的比例,再 O(n) 掃一遍,對於每次加入的方塊,判斷一下是否存在會出現目前加入的 B 和 W 的比例與整個序列相同,有就將 Ans+1 即可。 注意考慮整個序列都是 B 或者都是 W 的情況。

算法:

貪心

T2:0(40)

賽時:

這題乍眼看去相似一道簡單的貪心題。

可是,本想水個40分,可誰知一分都未水到。

賽後:

首先來想最簡單的動態規劃,通過第一個數的限制,我們可以得到每個位置的狀態可以從哪 些位置轉移過來,得到如下形式的式子: f(i) = 𝑚𝑎𝑥𝑗=𝑙[𝑖] 𝑖−1 (𝑠[𝑗 + 1][𝑖] + 𝑓[𝑗]) 其中 s[i][j]表示從 i 到 j 的最大值,l[i]表示 i 位置最多向左走到哪裏。 然後套路一波,用個單調遞減的單調隊列,每次將隊頭不合法的依次踢掉,然後我們來想想, 這樣我們只是得到了可以轉移過來的狀態集,那麼如何維護答案呢?

觀察下圖:

現在我們的 i 在位置 8 上,紅色框表示 i 向左最多到達的位置(即 2 與 8 的 p[i]是一樣的) 可以看出,除了隊頭之外,其他的在單調隊列裏的元素的貢獻都是從前面一個位置的 f 轉移 而來的(因爲 f 是單調不減的),而隊頭的則是依賴於 l[i]的。

假設當前的隊列爲:a[head. .tail]且∀head ≤ i < tail, a[i] < a[i + 1] 那麼當前點的答案爲:max(𝑚𝑎𝑥𝑗=ℎ𝑒𝑎𝑑+1 𝑡𝑎𝑖𝑙 (ℎ[𝑎[𝑗]] + 𝑓[𝑎[𝑗 − 1]]) , h[a[head]] + f[l[i] − 1]) 觀察到每次我們移動一個點是有許多沒有變的狀態的,每個元素進一次出一次,於是我們用 堆或者其他數據結構來維護隊列中每個元素的貢獻,對於隊頭特殊處理。

時間複雜度O(n 𝑙𝑜𝑔2n)

算法:

dp&單調隊列

T3:0(0)

賽時:

這一道題看不懂呀!!!

那賽時就更不用說用什麼思路了。

不過看懂也不知如何下手。

賽後:

算法:

三分

T4:0(0)

賽時:

一看就知到是一道最短路。

可是有思路但實現起來太複雜了。

於是打到一半,因前面調試第一題太久,突然聽到一聲巨響——

比賽結束了~~~

賽後:

本題有兩個部分:

(1)一串0和1組成序列,限制條件[a,b,c],表示第a個數到第b個數之間最少有c個1。

設s[i]表示前i位中1的個數。

對每個條件[a,b,c],有s[b]-s[a-1]>=c,即s[a-1]-s[b]<=-c

注意隱蔽條件:

s[i]-s[i-1]>=0,即s[i-1]-s[i]<=0

s[i]-s[i-1]<=1

用SPFA求出s[],s[i]-s[i-1]就是第i個數的屬性。

 

(2)有n個結點,從x直接飛到y,當且僅當存在一條x→t[0]→t[1]→…→t[k]→y的路徑:

dis[x→t[]→y] <= L,並且t[]的屬性爲0

最多飛K次(此時路徑長度按0算)

問從1到N的最短路;

 

dp[u,t]表示從1出發到u點飛t次的最短路

初始條件:dp[1,0]=0;

狀態轉移:使用spfa求解

for(u=1;u<=N;u++){
    if(dp[u][t]>dp[u][t]+g[u][v])dp[v][t]=dp[u][t]+g[u][v];
    if(t<K&&g[u][v]<=L&&dp[v][t+1]>dp[u][t])dp[v][t+1]=dp[u][t];
}

 

算法:

最短路&dp

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章