codevs3729 飛揚的小鳥

2022-05-09 18:26:49 字數 2189 閱讀 3580

[codevs3729]飛揚的小鳥

試題描述

輸入

輸出

輸出檔名為 bird.out。

共兩行。

第一行,包含乙個整數,如果可以成功完成遊戲,則輸出 1,否則輸出 0。

第二行,包含乙個整數,如果第一行為 1,則輸出成功完成遊戲需要最少點選螢幕數,

否則,輸出小鳥最多可以通過多少個管道縫隙。

輸入輸出示例

資料規模及約定

對於 30%的資料:5≤n≤10,5≤m≤10,k=0,保證存在一組最優解使得同一單位時間最多點選螢幕 3 次;

對於 50%的資料:5≤n≤20,5≤m≤10,保證存在一組最優解使得同一單位時間最多點選螢幕 3 次;

對於 70%的資料:5≤n≤1000,5≤m≤100;

對於 100%的資料: 5≤n≤10000, 5≤m≤1000, 0≤k題解

設 f[i][j] 表示橫座標在 i,縱座標在 j 的最小點選次數(若不能達到這個點則為正無窮)。考慮每次轉移,從 i-1 到 i,點選 k 次,縱座標增加 x[i-1] * k(增加後不能超過 m);或者不點選,縱座標減小 y[i-1]。

然而這樣的轉移是 o(n / x[i]) 的,當 x[i] 比較小時就過不了了,於是我們可以對 f[i][j] 的 j,及縱座標進行模 x[i-1] 分類,然後維護一下字首最小值即可。

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

const int buffersize = 1 << 16;

char buffer[buffersize], *head, *tail;

inline char getchar()

return *head++;

}int read()

while(isdigit(c))

return x * f;

}#define maxn 1010

#define maxl 10010

#define oo 2147483647

int n, m, k, f[2][maxn], minf[maxn], x[maxl], y[maxl];

struct tun

tun(int _1, int _2, int _3): up(_1), low(_2), x(_3) {}

bool operator < (const tun& t) const

} ts[maxl];

int main()

sort(ts + 1, ts + k + 1);

f[0][0] = oo;

for(int i = 1; i <= m; i++) f[0][i] = 0;

int cur = 1, kt = 1, at;

for(int i = 1; i <= n; i++, cur ^= 1)

for(int j = m + 1; j <= m + x[i-1]; j++)

for(int j = 1; j <= m - y[i-1]; j++)

f[cur][j] = min(f[cur][j], f[cur^1][j+y[i-1]]);

if(kt <= k && ts[kt].x == i)

// for(int j = 1; j <= m; j++) printf("%d ", f[cur][j] < oo ? f[cur][j] : -1); putchar('\n');

for(int j = 1; j <= m; j++) if(f[cur][j] < oo) }

int ans = oo;

for(int i = 1; i <= m; i++) ans = min(ans, f[cur^1][i]);

if(ans < oo) printf("1\n%d\n", ans);

else printf("0\n%d\n", at);

return 0;

}

飛揚的小鳥

顯然的思路,用網路流做。對每個洞拆點,i.j表示第i個洞被通過這個洞的倒數第j隻鳥通過。然後連邊跑費用流。然而邊數太多直接 怎麼辦?注意到i.j沒被流i.j 1就絕不可能被流。因此動態加邊,初始只連所有到x.1的。目前連到x.y,流成功一次加上所有到x.y 1的邊。然後莫名很慢,所以這裡本辣雞加上了...

飛揚的小鳥

飛揚的小鳥 這一題開始看到時就知道是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分,但這裡很容易犯的的乙個錯誤就是當在螢幕...