1. 程式人生 > >Codeforces - Tag::SP 大合集 [占坑]

Codeforces - Tag::SP 大合集 [占坑]

viso 相同 每次 challenge start down ima 給定 alt

完蛋了要掛科了,趕緊更新個專題冷靜一下
PS.僅按A題人數順序更新,選擇性忽略部分題
PPS.這個專題應該比較休閑吧

520B

給定初始n和目標m,存在兩種操作\(-1\)\(×2\),要求最少操作次數

無腦解法是BFS,不能解決稍大的規模

當n>m時,輸出n-m

否則逆向處理,轉換為m到n的最小操作次數,存在兩種操作\(+1\)\(/2\)(後者只能在偶數時操作)

\((m+1+1)/2=m/2+1\)得盡量多的/2操作可以減少操作次數

因此若操作當前的\(m?\)是偶數時盡量/2,直到\(m≤n?\)時再多操作\((n-m)?\)\(+1?\)是最優操作

Challenge: suppose we have a generalized problem: we want to get n

starting from m using two operations "subtract a" and "multiply by b". Generalize the solution to find the minimal number of moves to get from n to m in 技術分享圖片 time if a and b are coprime. Can you do it if a and b may have common divisors greater than 1?


339C

給出砝碼,限定重量類型但個數無限,求能否在天平上按照規則操作\(m\)次並輸出方案

規則1.每次使用的砝碼不能與上一次的相同重量

規則2:每次放入砝碼後該側的重量比另一側天平的重量大

我的想法:設\(dp[i][j][k]\):第\(i\)次放入重量為\(j\)的砝碼使另一側的天平為\(k\)

\(dp[i][j][k]=dp[i-1][x≠j][y<sum...]\)

但官方題解用到了平衡的想法來替代sum

那麽\(dp[i][j][k]\):存在第\(i\)次放入重量為\(j\)的砝碼使兩側平衡差為\(k\)的方案

\(dp[i][j][k]=dp[i-1][x≠j][y=j-k>0]\) ,只需存在一對\((x,y)\)該方程既為真

說明:記上一次平衡差為\(y\),假設砝碼放在左邊,則\(l-r=y\)

這次在右邊平衡差為\(k\),則\(r‘-l‘=k,l‘=l,r‘=r+j\)

\(∴y=j-k\)


295B

給定一個圖,頂點數\(n≤500\),圖中每對頂點都有兩條邊分別指向從對中某一點指向另一點,且權值給出

再給定一個刪除序列\(x[1...n]\),表示要按順序刪除某個點,求每次序列操作前剩余的所有點對的最短距離之和

逆向思維,考慮floyd三重循環最外層為加入頂點的順序,那我們把刪除序列翻轉過來就變為添加序列,既是一個floyd的過程

實現細節上的註意,添加\(x[k]\)點後先把\(x[k]\)相關的所有邊都優先松弛再進行內循環更新

PS.做完這道題後對floyd的細節有了船新的認識

https://paste.ubuntu.com/p/YVHzf8pk8R/


329B(水)

從起點走到終點,其中有些地方不能走,有些地方存在一些敵人(0~9),且能和我們一樣正常移動或者是停留,每次動作都是一個單位的時間,而敵人總是盡量殺向你。求起點到終點能最少幹掉敵人的數目。

要註意到的一點是必然能攔截自己的肯定是它們到終點的距離小於自己到終點的距離

然後從終點BFS就ok了


916C(水)

構造一個n個點m條邊的圖,使得其1到n最短路距離為素數,MST之和為素數,且沒環和重邊

很顯然構造一條鏈湊數就好


Last UPD:7.1

Codeforces - Tag::SP 大合集 [占坑]