1. 程式人生 > >USACO 2019 Jan Gold

USACO 2019 Jan Gold

times 需要 移動 收益 最大的 其它 找規律 上一個 子序列

poetry

題意:給\(n\)個單詞,每個單詞有長度和韻腳,然後要把它們組成一個\(m\)行的詩,每行的長度為\(k\),並且韻尾確定。問可以組成多少種詩。

思路:設\(dp(i)\)表示長度為\(i\)的句子有多少種表示方法。

那麽轉移就是和完全背包一模一樣。

當我們轉移到\(dp(k)\)的時候就可以記錄韻腳為什麽的表示種數。

然後對於每一種韻腳弄個快速冪算一下有多少就好了。

由於不同的韻腳是不相關的,所以所有韻腳的答案要乘起來。

sleepy

題意:給一個排列,現在要通過每次移動第一個數來排序,問每次第一個數要向右移動多少位。

思路:首先我們找規律。

如果我們要把一個序列排序,那麽肯定最後的那段連續上升子序列是不會動的。

所以我們就是每次把第一個數挪到它應該放到的位置上。

所以每次要挪的距離就是它到那個連續上升子序列的距離加上比它小的個數。

那麽用一個\(bit\)存下每個數是否存在,前綴和就是這個數的排名了。

shortcut

題意:給一個圖,從每個點有\(c_i\)個奶牛往\(1\)號點走字典序最小的最短路,每條邊有一個距離,現在要布置一個『捷徑』,長度為\(t\),從\(1\)號點到任意一個其它的點。問這條捷徑會帶來多大的便利。

思路:我們首先\(dij\)出最短路,然後算\(prv\)的時候需要註意一下取最小的,那麽就可以構出一棵樹,即最短路樹。

然後我們從每個點沿著\(prv\)\(1\)跑,跑的途中看我們可不可以在這個地方布置捷徑,如果會讓我們的距離縮短,那麽就可以把這個點的收益加上一個\(c_i\times (dis_u-t)\)

然後就找收益最大的點就好了。

USACO 2019 Jan Gold