洛谷 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

洛谷 P1941 飞扬的小鸟的更多相关文章

  1. Codevs 3729==洛谷P1941 飞扬的小鸟

    P1941 飞扬的小鸟 456通过 2.4K提交 题目提供者该用户不存在 标签动态规划2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录   题目描述 Flappy Bird 是一 ...

  2. [洛谷P1941] 飞扬的小鸟

    洛谷题目链接:飞扬的小鸟 题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了 ...

  3. [NOIP2014] 提高组 洛谷P1941 飞扬的小鸟

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

  4. 洛谷P1941飞扬的小鸟——细节DP

    题目:https://www.luogu.org/problemnew/show/P1941 此题主要注意许多细节,详见代码. 代码如下: #include<iostream> #incl ...

  5. 2018.11.06 洛谷P1941 飞扬的小鸟(背包)

    传送门 上升看成完全背包. 下降看成01背包. 注意边界转移就行了. 代码: #include<bits/stdc++.h> using namespace std; inline int ...

  6. 洛谷P1941 飞扬的小鸟 [noip2014] 背包

    正解:背包 解题报告: 话说好久没做背包的题了,都有些陌生了?这几天加强基础题目多刷点儿dp和背包趴qwq 其实这题是95...然后我下了我错的那个测试点,我答案是9874正解是9875...然后读入 ...

  7. 洛谷P1941 飞扬的小鸟(背包 dp)

    题意 题目链接 Sol 很显然的dp,设\(f[i][j]\)表示第\(i\)个位置,高度为\(j\)的最小步数 向上转移的时候是完全背包 向下转移判断一下就可以 #include<bits/s ...

  8. 洛谷 P1941 飞扬的小鸟【dp】

    设f[i][j]为在坐标(i,j)时的最小点击次数,转移的话从i-1向上飞或者向下掉转移,注意转移完了之后要把管子部分赋值为inf #include<iostream> #include& ...

  9. 洛谷P1941飞扬的小鸟 完全背包

    思维难度不大,就是有许多细节要注意. 1.不能开滚动数组. 2.要特判飞过天花板的情况. Code: #include<cstdio> #include<algorithm> ...

随机推荐

  1. [CQOI2006]凸多边形(半平面相交)

    嘟嘟嘟 本来我要写feng shui这道题的.然后网上都说什么半平面相交,于是我还得现学这个东西,就来刷这道模板题了. 所谓的半平面相交和高中数学的分数规划特别像.比如这道题,把每一条边看成一条有向直 ...

  2. programming-languages学习笔记--第4部分

    programming-languages学习笔记–第4部分 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} program ...

  3. MAC 下 安装redis 并配置 php redis 扩展

    下载 redis redis-3.1.2.tgz sudo tar -xzf redis-3.1.2.tgz cd redis-3.1.2 sudo phpize grep: /usr/include ...

  4. loadrunner脚本中参数化和返回值输出log到外部文件

    loadrunner脚本中参数化和返回值输出log到外部文件 很多时候,我们在做性能测试之前,需要造数据,但是使用的这些参数化数据和生成的返回数据在后面的测试都会用的,所以我们需要在造数据过程中,将参 ...

  5. 如何在localStorage中存取数组

    默认localStorage只能存取字符串 那么如何存取数组呢 let newlist = [] localStorage.setItem('recent', JSON.stringify(newli ...

  6. iOS开发Mac配置(CocoaPods、SourceTree、ssh key)

    作为开发,有一个自己的饭碗还是有必要的.因为交接旧电脑的时候,你会遇到了一些问题,而自己的电脑就方便很多了. 要开发,当然要装一些与开发相关的东西,那么新电脑入手,要做些什么呢? 1.安装Xcode: ...

  7. Angular7教程-04-Angular常用操作(下)

    6. 数据双向绑定 视图和数据,只要一方发生变化,另一方跟着变化. 好处是不需要在代码中手动更新视图,简化开发,增加代码内聚性,代码可读性更强. 缺点是当绑定的数据层次深.数据量大时,会影响性能. 双 ...

  8. js 实现内容的展开和收缩

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. 升级Xcode10报错问题修复

    Xcode10 问题1 报文件重复 File--> Workspace Settings --> Build System 修改为Legacy Build System (默认是New B ...

  10. Delphi XE5的Android开发平台搭建

    Delphi XE5支持Android ARM的开发,可以在Android虚拟机里运行,因此建议将XE5安装在64bit的Windows,内存可以大于3GB Delphi XE5安装光盘中包含了最基本 ...