PJ 4 題解
T1.The Prices
首先資料範圍:\(n\leqslant100,m\leqslant16\)
正解狀壓,一定要壓\(m\)這一維
賽時想到狀壓但是不好表示於是打了基於當前狀態的貪心拿了\(55pts\)
正解:
定義:\(dp[i][j]\) 表示前 \(i\) 個商店,買東西的狀態為\(j\)時的最小花費。
首先列舉每個商家,然後加上路費。注意如果兩次在同一條路上,需要減去重複的路費
然後列舉第\(i\)個商家的\(m\)件商品,並進行狀態轉移條件判斷:想買第\(k\)件商品,則前\(i-1\)個商家沒有買\(k\),所以\(j\)的二進位制的第\(k\)為\(0\)
然後狀態轉移方程就很簡單:\(dp[i][j|(1<<k-1)]=min(dp[i][j|(1<<k-1)],dp[i][j]+a[i][k])\)
最後就不買第\(i\)個商家的物品和買第\(i\)個商家的物品的情況進行比較,選出最優解。
T2.上白澤慧音
Tarjan求強連通分量
賽時由於Tarjan忘乾淨了跑了
賽後想出一種做法就是:
Tarjan求出所有強連通分量然後用小根堆堆存一下
最後比大小的時候先比堆的\(size\)再比堆頂元素(字典序)
每個節點只屬於一個SCC
所以對於每個儲存SCC的堆來說堆頂不可能相同
從而比堆頂就可以得出更優的答案
記錄下對應的SCC編號,直接去找對應堆的\(size\)並輸出元素就行本著不重複造能用的輪子的原則堆的實現直接std::priority_queue<int,vector<int>,greater<int> >
T3 GCD&LCM
這個應該是“Hankson的趣味題”的弱化版
方便描述,記\(G=\)gcd(x,y)
,\(x_0=\frac{x}{G},y_0=\frac{y}{G},L\)為lcm(x,y)
\(G*L=x*y\)
\(G*L=x_0*y_0*G^2\)
\(\frac{L}{G}=x_0*y_0\)
一切的前提是:
\(\frac{L}{G}\in N_+\)
於是得到一個特判:if(l%r)return;
非常好理解,和前提是等價的
然後就是第二個判斷
\(\because G=\)gcd(x,y)
\(\therefore\)gcd(x0,y0)
\(=1\)
不滿足這個條件的,不合法
然後就可以有\(O(\frac{x}{y})\)
不過分解因數注意好處理,寫法醜的就掛了
總結
T1貪心 T2 Tarjan板子不會 T3檔案掛
反正挺弱的