題解 Leyni的汽車比賽

2022-02-23 19:51:41 字數 2186 閱讀 6643

hrbust - 1404

思維題?居然被我湊出來了

這種圖論題先設這樣乙個狀態

\[ans(i,j,f)

\]表示從i到j,最多使用f個交通工具的最短路

轉移的話,每輛車先自己跑乙個floyd,然後進去就好了,轉移列舉中間點。

但是你說\(f\)很大,感覺這樣做不行了,但是仔細思考一下,最多換\(n\)輛車就會到達終點,所以讓\(f\)對\(n\)取min就好了。

這種分析複雜度的方法很好用,還有乙個更典型的例子是,乙個區間詢問題,區間長度是\(100\),詢問是\(1e5\)的,但是你每次詢問只會\(o(n^2)\)的暴力,怎麼過這個subtask? 直接記憶化啊!總共就\(100\times 90\)個不同的區間啊

於是我們獲得了乙個\(o(n^5)\)的做法,我以為可以過,但是有多組資料,交一發t了

for(register int t=1;t<=m;++t)

g[t].read(),g[t].gen();

for(register int t0=1;t0<=m;++t0)

for(register int f=1;f<=n+2;++f)

for(register int k=1;k<=n;++k)

for(register int t=1;t<=n;++t)

for(register int i=1;i<=n;++i)

ans[t][i][f]=min(ans[t][i][f],ans[t][i][f-1],ans[t][k][f-1]+g[t0][k][i],ans[t][k][f-1]+ans[k][i][1]);

for(register int t=1;t<=r;++t)

**中\(g\) 是我定義的結構體,裡面是乙個\(e[maxn][maxn]\),\(g[t].gen()\)是跑一遍floyd

考慮優化一下,由於我們是要求最小,我們看一下混亂不堪的轉移,考慮在min函式的第三個引數動動手腳,實際上,對於乙個確定\(f\),我們求乙個最小的\(g[t0][k][i]\)就好了,我們隨便找個東西存一下就完事了。

實際上我這份轉移靠感覺的**做了這件事情,就是\(ans[t][k][f-1]+ans[k][i][1]\),這裡\(ans[k][i][1]\)實際上就記錄了最小的\(g[t0][k][i]\)。所以我們少列舉乙個\(t0\),複雜度變為\(o(n^4)\)

本來這種思維題我是做不出來的,但d 是為啥我又寫出來了?因為我發現可以通過觀察**的行為來優化演算法。。。我用這種技巧已經幫助我在模擬賽裡多拿了好幾百分了23333333

沒有退役全靠它

//@winlere

#include#include#include#includeusing namespace std; typedef long long ll;

inline int qr()

const int maxn=51;

const int inf=0x3f3f3f3f;

int ans[maxn][maxn][53];

int n,m,r;

struct graph

inline int* operator (register int x)

inline void gen()

inline void print()

}g[maxn];

inline int min(const int&a,const int&b)

inline int min(const int&a,const int&b,const int&c)

inline int min(const int&a,const int&b,const int&c,const int&d)

int main()

for(register int f=1;f<=n+2;++f)

for(register int k=1;k<=n;++k)

for(register int t=1;t<=n;++t)

for(register int i=1;i<=n;++i)

ans[t][i][f]=min(ans[t][i][f],ans[t][i][f-1],ans[t][k][f-1]+ans[k][i][1]);

for(register int t=1;t<=r;++t)

}return 0;

}

12 7 比賽題解

這個題的意思就是對於給定的數x,找到兩個數a,b滿足以下條件 可以看出a,b是不唯一的,所以這道題是spj,那我們只要找到最好找的就好了。a b 最大的時候,就是a b x對吧,正好這時候也滿足題目中的其它要求。如果x x 都不滿足大於 x 這個條件的話,肯定就無解了,所以我們只需要判斷這個條件就好...

題解 騎車比賽

描述 小信準備去參加騎車比賽,比賽在 n 個城市間進行,編號從 1 到 n。選手們都從城市 1 出發,終點在城市 n。已知城市間有 m 條道路,每條道路連線兩個城市,注意道路是雙向的。現在小信知道了他經過每條道路需要花費的時間,他想請你幫他計算一下,他這次比賽最少需要花多少時間完成。輸入第一行輸入兩...

vjudge比賽題解

題目位址 這道題本身不難,難在題目要求的格式上,所以新手多數會卡著格式不過關而不能ac。空白行就是在endl後還要endl一次,而且要在最後一次輸出中不輸出空白行就行了。至於大數加法可以參考這份部落格 大數專題 include include include include using namesp...