[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分,但這裡很容易犯的的乙個錯誤就是當在螢幕...