飛揚的小鳥

2021-07-22 08:53:55 字數 1296 閱讀 9990

顯然的思路,用網路流做。

對每個洞拆點,i.j表示第i個洞被通過這個洞的倒數第j隻鳥通過。

然後連邊跑費用流。

然而邊數太多直接**,怎麼辦?

注意到i.j沒被流i.j+1就絕不可能被流。

因此動態加邊,初始只連所有到x.1的。

目前連到x.y,流成功一次加上所有到x.y+1的邊。

然後莫名很慢,所以這裡本辣雞加上了對只有乙個洞的特判(面向資料程式設計)

#include

#include

#define fo(i,a,b) for(i=a;i<=b;i++)

#define fd(i,a,b) for(i=a;i>=b;i--)

using namespace std;

const int maxn=100000+10,maxm=7000000+10,inf=1000000000;

int h[maxn],d[maxn],now[maxn],go[maxm],dis[maxm],co[maxm],fx[maxm],next[maxm];

int id[150][850],di[150

*850+10][2],time[50][150],a[50],w[850];

bool bz[maxn];

int i,j,k,l,r,s,t,n,m,p,tot,top,ans,last;

void add(int

x,int

y,int z,int c,int d)

int dfs(int

x,int flow,int las,int cost)

bz[x]=1;

int r=now[x],k;

while (r)

}r=next[r];

}return now[x]=0;

}bool change()

}if (tmp==inf) return

0; fo(i,s,t)

if (bz[i]) d[i]+=tmp;

return1;}

intread()

returnx;}

int main()

s=1;t=p*m+n+2;

fo(i,1,n)

top=n+1;

fo(i,1,m)

fo(j,1,p)

if (j<=p)}do

fill(bz+s,bz+t+1,0);

}}while (change());

printf("%d\n",ans);

}

飛揚的小鳥

飛揚的小鳥 這一題開始看到時就知道是dp,但作死打了個dfs,只有75分 卡常 好 includeusing namespace std const int n 10005 const int inf 9999999 int g sum n g up n g down n up n down n n...

飛揚的小鳥

首先這道題爆搜可做,理論上可以拿50分的,但由於windows下棧空間只有3w多,所以只能拿到35分。然後我們考慮dp 應該很容易想到是dp 定義狀態f i j 為在點 i,j 時最少的觸屏次數,然後列舉觸屏次數轉移即可。這樣複雜度是o nm 2 可以拿70分,但這裡很容易犯的的乙個錯誤就是當在螢幕...

飛揚的小鳥

題目描述 為了簡化問題,我們對遊戲規則進行了簡化和改編 1 遊戲介面是乙個長為n,高為m的二維平面,其中有k個管道 忽略管道的寬度 2 小鳥始終在遊戲介面內移動。小鳥從遊戲介面最左邊任意整數高度位置出發,到達遊戲介面最右邊時,遊戲完成。3 小鳥每個單位時間沿橫座標方向右移的距離為1,豎直移動的距離由...