1. 程式人生 > 其它 >PJ 4 題解

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})\)

的直接判斷做法和\(O(\sqrt \frac{x}{y})\)分解因數做法
不過分解因數注意好處理,寫法醜的就掛了

總結

T1貪心 T2 Tarjan板子不會 T3檔案掛
反正挺弱的