2022.03.21飞扬的小鸟

(题目来源:https://www.luogu.com.cn/problem/P1941 )

题目描述

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

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

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

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

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

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

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

输入格式
第 1 行有 3 个整数 n, m, k, 分别表示游戏界面的长度,高度和水管的数量,每两个整数之间用一个空格隔开;

接下来的 n 行,每行 2 个用一个空格隔开的整数 x 和 y,依次表示在横坐标位置 0∼n−1 上玩家点击屏幕后,小鸟在下一位置上升的高度 x,以及在这个位置上玩家不点击屏幕时,小鸟在下一位置下降的高度 y。

接下来 k 行,每行 3 个整数 p,l,h,每两个整数之间用一个空格隔开。每行表示一个管道,其中 p 表示管道的横坐标,l 表示此管道缝隙的下边沿高度,h 表示管道缝隙上边沿的高度(输入数据保证 p 各不相同,但不保证按照大小顺序给出)。

输入格式

第 1 行有 3 个整数 n,m,k,分别表示游戏界面的长度,高度和水管的数量,每两个整数之间用一个空格隔开;

接下来的 n 行,每行 2 个用一个空格隔开的整数 x 和 y,依次表示在横坐标位置 0∼n−1 上玩家点击屏幕后,小鸟在下一位置上升的高度 x,以及在这个位置上玩家不点击屏幕时,小鸟在下一位置下降的高度 y。

接下来 k 行,每行 3 个整数 p,l,h,每两个整数之间用一个空格隔开。每行表示一个管道,其中 p 表示管道的横坐标,l 表示此管道缝隙的下边沿高度,h 表示管道缝隙上边沿的高度(输入数据保证 p 各不相同,但不保证按照大小顺序给出)。

输出格式

共两行。

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

第二行,包含一个整数,如果第一行为 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
6

思路

做dp题需要步步为营,定义状态、初始状态、状态转移想清楚后方能编写代码。做本题我的思路是通过当前步数退出下一列的步数。

  1. 定义状态
    dp[i][j]: 到(i,j)位置最少步数
  2. 初始状态
    除dp[i][0]以外都初始为+INF
  3. 转移方程
    如果dp[i][j] != INF,hi(i+上升的高度)没碰到管道,则dp[hi][j+1] = min(dp[hi][j+1], dp[i][j]+步数)

注意

  1. 小鸟高度等于 0 或者小鸟碰到管道时,游戏失败。
  2. 小鸟高度为 m 时,无法再上升。
  3. 每一步小鸟可以上升多次。

在本次代码中,做了两处优化:

  1. 当走到某一列无法前进时,提前结束dp过程。
  2. 每次遍历,不考虑管道的位置。

但进官如此,仍然只能得到80分…

代码

 int n,m, k, INF=Integer.MAX_VALUE;int[] x = new int[10001];int[] y = new int[10001];pip[] ps = new pip[10001];int[][] dp = new int[1002][10002];//dp[i][j]: 到(i,j)位置最少步数//初始化状态:除dp[i][0]以外都初始为+INF//转移方程:如果dp[i][j] != INF,hi或li有一个在范围内,void test() throws IOException  {Reader cin = new Reader();n = cin.nextInt();m = cin.nextInt();k = cin.nextInt();for(int i = 0; i < n; i++) {x[i] = cin.nextInt();y[i] = cin.nextInt();}for(int i = 0; i < k; i++) {int co = cin.nextInt();int lo = cin.nextInt();int hi = cin.nextInt();ps[co] = new pip(lo, hi);}for(int i = 0; i <= m ;i++) for(int j = 1; j <= n; j++) dp[i][j] = INF;int lasInd = -1;for(int j = 0; j < n; j++) {boolean canGo = false;int beg = 1, end = m;if(ps[j] != null) {beg = ps[j].low+1;end = ps[j].high-1;}for(int i = beg; i <= end; i++) {if(dp[i][j] == INF) continue;int curx = 1;while(true) {int hi = Math.min(m, i+curx*x[j]);if(ps[j+1]==null || (ps[j+1].low < hi && ps[j+1].high > hi)) { //如果(i,j)可到达//更新dp[hi][j+1]dp[hi][j+1] = Math.min(dp[hi][j+1], dp[i][j]+curx);canGo = true;}if(hi >= m) break;curx++;}int li = i-y[j];if(li > 0 && (ps[j+1]==null || (ps[j+1].low < li && ps[j+1].high > li))) { //如果(i,j)可到达//更新dp[hi][j+1]dp[li][j+1] = Math.min(dp[li][j+1], dp[i][j]);canGo = true;}}if(!canGo) { //第j+1不可达lasInd = j;break;}}int res = INF;for(int i = 0; i <= m; i++) {res = Math.min(dp[i][n], res);}if(res == INF) { //如果不可通int cnt = 0;for(int j = 0; j <= lasInd; j++) {if(ps[j] != null) cnt++;}System.out.println(0);System.out.println(cnt);} else {System.out.println(1);System.out.println(res);}}

2022.03.21飞扬的小鸟相关推荐

  1. Quartus II 13.0 使用自带仿真小窗口闪退问题(2022.03.21)

    问题具体描述:我在win7环境下安装了破解版的13.0,编译没有问题,选择Quartus II Simulator 进行仿真时出现小窗口一闪而过,随后没有其他反应. 解决过程:据说工程目录里不可以有空 ...

  2. 模拟电路学习2(2022.3.21)

    模拟电路学习2(2022.3.21)"放大电路的构成与分析方法" 构建交流放大电路:有源元件(本质上放大的是功率,即电流电压全部都需要被放大,因而需要有外部的电源提供能量)-> ...

  3. NOIP2014 飞扬的小鸟

    3. 飞扬的小鸟 (bird.cpp/c/pas) [问题描述] Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的 ...

  4. 洛谷 P1941 飞扬的小鸟

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

  5. Star Way To Heaven (prim最小生成树) // [ NOIP提高组 2014]飞扬的小鸟(DP)

    文章目录 T1:Star Way To Heaven 题目 题解 代码实现 T2:飞扬的小鸟 题目 题解 代码实现 T1:Star Way To Heaven 题目 小 w 伤心的走上了 Star w ...

  6. c++飞扬的小鸟游戏_通过建立一个飞扬的鸟游戏来学习从头开始

    c++飞扬的小鸟游戏 Learn how to use Scratch 3.0 by building a flappy bird game in this course developed by W ...

  7. P1422 小玉家的电费--2022.03.15

    /* P1422 小玉家的电费--2022.03.15 https://www.luogu.com.cn/problem/P1422 */ #include <bits/stdc++.h> ...

  8. [DP]Luogu 2014NOIP提高组 飞扬的小鸟题解

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

  9. Luogu 1941 【NOIP2014】飞扬的小鸟 (动态规划)

    Luogu 1941 [NOIP2014]飞扬的小鸟 (动态规划) Description Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度 ...

最新文章

  1. linux 查看库的安装信息
  2. Go的结构体对接受者函数的传递
  3. 女神!浙大教授荣获世界杰出女科学家奖!
  4. _Linux内核分析(二)-内核模块简介和简单内核模块实现
  5. 苹果关闭iOS 14.1验证通道,阻止 iOS 14.2 降级
  6. 【收藏】ASP.NET英文技术文章推荐[11/4 - 11/11]
  7. pycharm appiunm 公众号测试_知道答案公众号_知到APP笔尖上的艺术——书法基础与赏析单元测试答案_知道答...
  8. HDU 4946 Area of Mushroom(2014 Multi-University Training Contest 8)
  9. [ArcPy百科]第三节: Geometry信息中的空间参考解析
  10. Quartz定时任务手动触发
  11. Redis详细使用文档记录
  12. 用计算机算e的平方为什么显示错误,计算器中出现的E是什么意思?
  13. 使用NuSMV解决过河问题
  14. 少儿计算机基础知识,学会这三个小知识,轻松入门少儿编程
  15. HTML5七夕情人节表白网页制作【樱花雨+爱心3D相册】HTML+CSS+JavaScript
  16. 分身竞选总统?法国总统竞选这么干! 全息3d网
  17. 【LCA】最近公共祖先问题Lowest Common Ancestors
  18. PAT A1091 Acute Stroke
  19. 双功能交联剂丨Lumiprobe 磺基花青7二羧酸研究
  20. 关于2023年-每日一更-费曼学习法

热门文章

  1. java实现端口映射_Java BIO实现TCP端口转发(端口映射)功能源码
  2. 学术-物理:莫比乌斯带
  3. 梦幻西游 python.dll,答疑第三期 | 使用 Airtest 最常见的 8 大问题
  4. iOS NSPredicate 模糊、精确、查询
  5. redhat linux下安装jq和jq的简单应用
  6. trac mysql_无法加载MySQL的Python绑定 – Trac
  7. [杂言] 我,计算机,OI,和我的前 18 年,还有退役
  8. 1.4 Go开发工具
  9. 2022国赛题vsftpd
  10. 假如有人把支付宝的服务器炸了, 存在支付宝里的钱是不是没了?