思路比較新奇,但是想到了題目還是挺好做的
看到最小和次數可以想到最短路.看到資料範圍可以想到必須在跑dij的時候記錄次數.由於要記錄的是最短路的方案,易證如果一種藥有一種更便宜的配置方法,我們不會記錄貴的那種.
於是,我們可以將這道題轉化為乙個用堆優化的dij.如果一種藥水在堆頂,那麼這種藥水不可能有更便宜的配置方法
如果由a藥水和b藥水合成c藥水比之前找到的配置方法便宜,那麼c藥水的配置方法數量為 a藥水的配置方法 \(*\) b藥水的配置方法.
如果由a藥水和b藥水合成c藥水等於之前找到的配置方法,那麼c藥水的配置方法數量為 c藥水的配置數量 \(+\) a藥水的配置方法 \(*\) b藥水的配置方法.
在遍歷圖的時候,只有兩種藥水都被證實為最小花費,他們合成的藥水才會是他們能得到的最小值.要證明這兩種的最小花費的方法是:如果他倆在堆裡出現過,那麼他們一定是最小花費.這個操作可以用vis陣列實現
遍歷整張圖,最後到0的距離+配置0的方案數就是答案
#include #include #include #include using namespace std;
#define pp pair#define f first
#define s second
const int maxn = 1e3+5;
vectoradj[maxn];
priority_queueq;
int n;
int dist[maxn], ways[maxn],ans1,ans2,in[maxn];
bool vis[maxn];
int main()
ans1 = dist[0]; ans2 = 1;
int a,b,c;
while(cin >> a >> b >> c)
while(!q.empty())else if (dist[v.s]==qf+dist[v.f])
}} cout << dist[0] << " " <}
2020520 PTA鑽石爭霸賽 T8
當時怎麼就沒想到這個做法呢?首先我們列舉每一條邊,作為三角形的第二條邊,然後二分去找三角形的第三條邊,由三角形兩邊之和大於第三邊以及三角形兩邊之差小於第三邊,我們可以確定乙個取數範圍,統計一下就可以了。include include include include include include i...
無聊測試賽 T12 道路
這道題的大致題意是 根據最短路求邊的拓撲圖,然後求出每個邊的入度。我用 dijkstra 求最短路,順便建好圖。之後使用 bfs 來遞推拓撲條件,儲存至 ans 陣列。注意事項 使用 long long,你們懂得。這個做法需要倒序遍歷邊,因為只有倒序遍歷能滿足拓撲序。本 需要 o 2 優化 才可通過...
2015 藍橋杯 T8 移動距離
題目說明 移動距離 1 2 3 4 5 6 12 11 10 9 8 7 13 14 15 我們的問題是 已知了兩個樓號m和n,需要求出它們之間的最短移動距離 不能斜線方向移動 輸入為3個整數w m n,空格分開,都在1到10000範圍內 w為排號寬度,m,n為待計算的樓號。要求輸出乙個整數,表示m...