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...