洛谷 P1941 飞扬的小鸟

时间:2021-09-03 03:26:42

洛谷 P1941 飞扬的小鸟

原题链接

首先吐槽几句

noip都快到了,我还不刷起联赛大水题!

题目描述

Flappy Bird 是一款风靡一时的休闲手机游戏。玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙。如果小鸟一不小心撞到了水管或者掉在地上的话,便宣告失败。

为了简化问题,我们对游戏规则进行了简化和改编:

游戏界面是一个长为n ,高为 m 的二维平面,其中有k 个管道(忽略管道的宽度)。

小鸟始终在游戏界面内移动。小鸟从游戏界面最左边任意整数高度位置出发,到达游戏界面最右边时,游戏完成。

小鸟每个单位时间沿横坐标方向右移的距离为1 ,竖直移动的距离由玩家控制。如果点击屏幕,小鸟就会上升一定高度X ,每个单位时间可以点击多次,效果叠加;

如果不点击屏幕,小鸟就会下降一定高度Y 。小鸟位于横坐标方向不同位置时,上升的高度X 和下降的高度Y 可能互不相同。

小鸟高度等于0 或者小鸟碰到管道时,游戏失败。小鸟高度为 m 时,无法再上升。

现在,请你判断是否可以完成游戏。如果可以 ,输出最少点击屏幕数;否则,输出小鸟最多可以通过多少个管道缝隙。

输入输出格式

输入格式:

输入文件名为 bird.in 。

第1 行有3 个整数n ,m ,k ,分别表示游戏界面的长度,高度和水管的数量,每两个

整数之间用一个空格隔开;

接下来的n 行,每行2 个用一个空格隔开的整数X 和Y ,依次表示在横坐标位置0 ~n- 1

上玩家点击屏幕后,小鸟在下一位置上升的高度X ,以及在这个位置上玩家不点击屏幕时,

小鸟在下一位置下降的高度Y 。

接下来k 行,每行3 个整数P ,L ,H ,每两个整数之间用一个空格隔开。每行表示一

个管道,其中P 表示管道的横坐标,L 表示此管道缝隙的下边沿高度为L ,H 表示管道缝隙

上边沿的高度(输入数据保证P 各不相同,但不保证按照大小顺序给出)。

输出格式:

输出文件名为bird.out 。

共两行。

第一行,包含一个整数,如果可以成功完成游戏,则输出1 ,否则输出0 。

第二行,包含一个整数,如果第一行为1 ,则输出成功完成游戏需要最少点击屏幕数,否则,输出小鸟最多可以通过多少个管道缝隙。

输入输出样例

输入样例#1:

10 10 6
3 9
9 9
1 2
1 3
1 2
1 1
2 1
2 1
1 6
2 2
1 2 7
5 1 5
6 3 5
7 5 8
8 7 9
9 1 3

输出样例#1:

1
6

输入样例#2:

10 10 4
1 2
3 1
2 2
1 8
1 8
3 2
2 1
2 1
2 2
1 2
1 0 2
6 7 9
9 1 4
3 8 10

输出样例#2:

0
3

【输入输出样例说明】

自己去看题。。。

【数据范围】

对于30% 的数据:5 ≤ n ≤ 10,5 ≤ m ≤ 10,k = 0 ,保证存在一组最优解使得同一单位时间最多点击屏幕3 次;

对于50% 的数据:5 ≤ n ≤ 2 0 ,5 ≤ m ≤ 10,保证存在一组最优解使得同一单位时间最多点击屏幕3 次;

对于70% 的数据:5 ≤ n ≤ 1000,5 ≤ m ≤ 1 0 0 ;

对于100%的数据:5 ≤ n ≤ 100 0 0 ,5 ≤ m ≤ 1 0 00,0 ≤ k < n ,0<X < m ,0<Y <m,0<P <n,0 ≤ L < H ≤ m ,L +1< H 。

题解、我自己的思路

50分算法

f[i][j]表示在距离最左边i个单位,高j的最少点击次数。

容易想到

\[f[i][j]+k->f[i+1][max(m,j+k*x[i])] (k=1...m)……1
\]

\[f[i][j]->f[i+1][j-y[i]]……2
\]

再判断一下越界、特判一下k再加会不会产生贡献,即可获得50分。

AC算法

上面1式看做完全背包,2式看做01背包求解。

我傻啦

增加一个g,专门用于完全背包的转移。

AC

Code

// It is made by XZZ
#include<cstdio>
#include<algorithm>
#define Fname "birda"
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){
rg int x=0,f=1;rg char ch=getchar();
while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
il vd Min(int&a,int b){a=min(a,b);}
int f[2][1010],g[2][1010],l[10001],r[10001];
int x[10001],y[10001];
int main(){
int n=gi(),m=gi(),kk=gi(),p;
rep(i,0,n-1)x[i]=gi(),y[i]=gi();
rep(i,0,n)l[i]=0,r[i]=m+1;
rep(i,1,kk)p=gi(),l[p]=gi(),r[p]=gi();
int now=0,minn,res=0;
rep(i,0,n-1){
rep(j,1,m)f[now^1][j]=g[now^1][j]=1e9;
minn=1e9;
rep(j,1,l[i])f[now][j]=1e9;
rep(j,r[i],m)f[now][j]=1e9;
rep(j,1,m)g[now][j]=1e9;
rep(j,1,m){
minn=min(minn,f[now][j]);
Min(g[now][j],f[now][j]);
if(j!=m)Min(g[now][min(m,j+x[i])],g[now][j]+1);
Min(f[now^1][min(m,j+x[i])],g[now][j]+1);
}
rep(j,max(l[i],y[i])+1,r[i]-1)Min(f[now^1][j-y[i]],f[now][j]);
if(minn==1e9){printf("0\n%d\n",res);return 0;}
if(!(l[i]==0&&r[i]==m+1))++res;
now^=1;
}
int ans=1e9;
rep(i,1,m)if(i>l[n]&&i<r[n])Min(ans,f[now][i]);
if(ans==1e9){printf("0\n%d\n",res);return 0;}
printf("1\n%d\n",ans);
return 0;
}

另:我在DEBUG时自己下载的data

In:1
5 5 0
3 3
2 1
2 3
2 1
3 2
Out:1
1
2
In:2
500 50 26
13 30
40 8
35 21
42 25
27 41
7 39
37 48
35 13
35 43
46 28
28 21
31 14
22 4
30 29
7 49
47 19
30 42
26 15
13 24
44 40
20 2
34 8
5 24
20 39
17 21
22 1
46 3
14 19
7 49
3 18
4 5
37 38
47 18
9 10
46 3
5 17
9 38
24 13
12 48
7 29
24 28
34 21
36 3
44 47
2 46
15 11
1 2
48 3
25 7
18 21
10 22
37 23
16 16
36 27
19 42
11 43
26 44
14 12
47 13
9 4
9 23
14 14
30 18
17 10
24 34
30 38
11 23
12 26
43 3
9 13
49 24
11 25
19 29
41 21
41 49
29 5
28 48
18 13
16 39
22 44
28 7
33 39
29 49
15 23
2 28
40 6
3 1
31 26
29 27
2 20
32 30
24 10
28 46
22 48
36 48
43 19
5 26
8 34
30 28
12 36
6 2
41 13
2 27
38 30
5 39
5 36
20 33
1 3
29 27
2 20
25 49
39 34
30 2
18 10
34 29
45 45
35 41
8 36
19 46
21 28
35 30
19 10
13 19
13 47
45 19
22 25
18 16
9 47
18 32
12 7
16 12
2 2
3 15
42 26
11 14
9 1
43 27
11 12
1 28
14 1
2 35
25 24
2 39
21 24
21 37
35 41
48 37
42 6
2 35
37 17
4 45
17 2
28 32
13 28
10 31
34 16
17 14
39 23
3 15
2 28
2 36
20 49
28 17
11 29
2 47
1 10
42 23
12 25
5 29
9 20
11 42
35 27
6 25
5 9
39 6
41 46
41 11
45 20
28 6
4 34
8 10
44 1
32 6
30 36
34 38
11 44
30 46
26 36
26 30
49 20
35 40
16 32
7 17
2 39
27 10
23 35
19 17
40 1
27 20
42 17
9 3
16 43
4 42
34 34
27 33
5 18
29 25
49 35
41 6
24 19
15 2
9 34
24 48
39 1
23 31
22 31
39 38
30 47
35 14
32 12
47 41
29 31
16 28
21 13
38 44
31 4
1 44
42 24
42 31
30 15
18 2
2 12
44 31
9 29
44 45
41 46
36 20
27 3
4 3
20 41
46 1
49 3
44 41
26 41
28 11
11 1
18 12
12 12
42 25
41 42
21 37
43 12
12 26
19 20
28 38
12 30
43 16
32 42
8 13
33 40
24 44
40 46
11 7
8 4
36 4
1 12
45 43
24 8
19 47
27 47
36 43
32 29
10 14
27 22
26 10
12 5
9 7
1 20
18 14
28 9
22 28
21 18
26 49
30 1
2 12
3 37
11 34
22 20
47 48
46 28
13 13
33 22
24 38
46 41
7 24
5 29
7 30
2 32
29 36
32 31
47 34
23 8
18 49
32 20
47 33
48 16
45 36
42 19
29 38
15 36
12 25
20 23
5 26
5 39
12 42
25 9
31 47
22 5
3 9
24 5
42 27
20 42
13 12
12 47
49 31
33 16
6 3
38 11
28 48
49 44
40 24
8 26
26 29
30 28
43 10
33 35
36 8
27 5
20 43
2 24
30 34
40 35
41 33
1 24
31 5
18 26
33 25
3 10
10 32
42 8
46 30
42 33
38 24
37 8
23 43
31 3
32 26
42 28
10 43
2 40
47 24
22 31
4 24
45 18
11 37
25 8
23 22
45 11
2 37
18 24
30 4
31 17
30 23
44 44
16 1
39 19
29 11
5 37
39 49
6 6
41 35
13 14
13 13
29 14
49 46
42 34
6 23
1 35
45 49
34 17
49 23
35 28
34 44
20 28
48 25
33 44
16 45
14 28
13 42
41 12
39 33
45 49
11 1
34 6
49 18
22 4
45 12
36 29
11 7
8 9
36 40
4 2
41 17
34 4
9 30
21 3
13 21
2 28
22 40
34 26
13 11
35 9
28 21
42 38
27 5
47 19
45 6
25 41
27 10
49 40
39 20
43 8
46 49
35 23
45 24
48 8
35 33
21 18
10 14
6 41
18 8
10 18
18 35
14 44
49 14
35 38
38 33
1 34
32 36
7 27
10 11
40 49
48 11
17 8
24 28
49 47
35 14
15 4
48 29
3 3
47 37
41 35
20 41
20 8
32 31
39 47
41 34
46 40
45 19
3 24
46 2
26 36
21 46
44 19
30 47
27 27
34 18
17 10
14 41
22 46
23 16
48 19
1 49
14 1
18 17
24 19
23 6
6 43
2 5
18 31
2 44
8 41
17 29
1 30
21 27
31 43
42 29
17 47
34 31
47 7
201 26 45
157 31 43
476 32 37
265 13 50
300 25 27
478 4 25
485 29 44
425 22 44
392 44 49
133 25 38
320 27 50
384 2 45
313 25 40
287 16 29
7 1 11
250 7 43
130 43 46
46 16 32
2 17 42
5 8 13
158 0 24
297 27 30
499 40 47
397 43 49
431 0 31
63 42 50
Out:2
0
14