1. 程式人生 > >2016.10.15【初中部 NOIP提高組 】模擬賽C

2016.10.15【初中部 NOIP提高組 】模擬賽C

現在才AK,我的心啊……

T1:

題目大意:

兩頭公牛之間至少有有k頭奶牛的組合有多少種?

dp.

設f[i]表示到前i頭牛能組成的方案數.

分類討論:

對於i<=k,則不可能放兩隻公牛,公牛放一隻有i種,不放公牛也算一種,合起來就是i+1種

對於i>k,可以放n多隻公牛,那麼很明顯,如果第i個為母牛,則方案數為f[i-1],若放公牛則方案數為f[i-k-1](這樣子才能去重)

T2:

題目大意:

給你一堆計算公式,讓你求一個最終的最優值。

分析:

注意,這些計算公式有一個特點,那就是根據下標的位置來計算的。

沒看懂題的就可以ctrl+w了……

那麼,設一個最容易想到的狀態:

f[i,j]表示前i個數選j個數的最優值,且第i個必選。

則對於前i個數,因為計算值與下標有關,所以我們還需列舉一個下標k,前k個數的值可以直接通過狀態值求出。

而k+1到i-1需要計算得出值,設為sum(這也需要個迴圈)

f[i,j]=min{sum+f[k,j-1]}

這樣就可以求解最優值了.

注意當我們對狀態f[i,j]是否為最優值時,對於i+1到n的還要再算出來,這些也是需要費用的,費用也很容易算出來,直接按照公式第三步按部就班就Ok了.

時間複雜度將近O(n^4)

當然,還可以優化時間.

不先列舉個數j,先列舉k,然後求一個區間的值,記為sum,則可以為O(n³)

T3:

顯然對於兩種下車的奶牛(a,b),(c,d),若c>a,d<b,則如果車滿的話肯定踢掉a,b

按照此思路然後用個鄰接表求一下好了

具體取法如下:

如果當前前面上車的奶牛數為x,現在需要上車的奶牛加上x大於了總載量,則肯定先載到滿之後在看餘下的是否能代替一些牛。

T4:

連負邊,走一遍spfa,注意:如果某一個點經過的次數“過多”就是出現了負環,輸出無解即可。