题目描述

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

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

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

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

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

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

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

Solution

这道题是一道类似于01背包与完全背包混合加上一些特判的题。
看到数据范围,完全就是为O(nm)而设计的,所以我们放心的设计下状态,dp【i】【j】表示小鸟到ij点时最少的点击次数。
这道题细节很多,接下来一点一点说。
因为要求最小值,所以初始值全是INF,dp【0】【1~m】=0,表示小鸟可以从这个范围开始飞行。
考虑小鸟可以怎么飞。
点一次屏幕,小鸟上升x高度,但可以点多次,所以可以从i状和i-1状态转移;
不点屏幕,小鸟下落,但只能下落一次,所以直接从i-1转移即可(PS一定要在上升状态转移完之后再去考虑这种转移,否则bird会有升有降的)
转移从1-m(否则会少很多种情况),再把小鸟达不到的范围设置成INF即可(这样就很完美了)。
我们在dp时可以设置一个标记flag,当可行范围内的点被更新过后就打标记,如果一次dp后没有标记说明不可行,直接break。

#include<iostream>
#include<cstdio>
using namespace std;
int dp[10009][1009],n,m,k,kk,vis[10009];
struct de
{
int x,y;
}a[10009];
struct sd
{
int x,low,up;
}b[10009];
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;++i)
scanf("%d%d",&a[i].x,&a[i].y);
for(int i=1;i<=k;++i)
{
scanf("%d%d%d",&b[i].x,&b[i].low,&b[i].up);
vis[b[i].x]=i;
}
for(int i=1;i<=n;++i)
for(int j=0;j<=m;++j)
dp[i][j]=0x3f3f3f3f;
dp[0][0]=0x3f3f3f3f;
for(int i=1;i<=n;++i)
{
int low=1,up=m,flag=1;
if(vis[i])
{
low=b[vis[i]].low+1;
up=b[vis[i]].up-1;
}
for(int j=1;j<=m;++j)
{
if(j-a[i-1].x>=1)dp[i][j]=min(min(dp[i][j],dp[i][j-a[i-1].x]+1),dp[i-1][j-a[i-1].x]+1);
if(j==m)
for(int l=m;l>=m-a[i-1].x;--l)
dp[i][j]=min(min(dp[i][j],dp[i-1][l]+1),dp[i][l]+1);
if(j<=up&&j>=low&&dp[i][j]!=0x3f3f3f3f)flag=0;
}
for(int j=1;j<=m;++j)
{
if(j+a[i-1].y<=m)dp[i][j]=min(dp[i][j],dp[i-1][j+a[i-1].y]);
if(j<=up&&j>=low&&dp[i][j]!=0x3f3f3f3f)flag=0;
}
for(int j=0;j<=low-1;++j)
dp[i][j]=0x3f3f3f3f;
for(int j=up+1;j<=m;++j)
dp[i][j]=0x3f3f3f3f;
if(flag)
{
cout<<0<<endl<<kk;
return 0;
}
if(vis[i])kk++;
}
int ans=0x7f7f7f7f;
for(int i=1;i<=m;++i)
ans=min(ans,dp[n][i]);
cout<<1<<endl<<ans;
return 0;
}

  

NOIP 飞扬的小鸟 题解的更多相关文章

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

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

  2. noip飞扬的小鸟

    题解: 挺简单的题目 f[i][j]表示x坐标为i,y坐标为j的最小值 会发现那个东西是个完全背包 从f[i][j-a[i]]转移一下就是O(1)转移的了 另外上界为m这个要特判一下 我把sum[a[ ...

  3. 洛谷 P1194 飞扬的小鸟 题解

    题面 这道题是一道隐藏的比较深的DP(我太蒟蒻了!) 设f[i][j]表示到第i列时高度为j的最少步数是多少: 求上升时的方案就是一个完全背包!,求下降时的方案就是一个01背包: 然后处理边界就能A掉 ...

  4. NOIP 2014飞扬的小鸟(DP优化)

    题目链接  飞扬的小鸟 考场的70分暴力(实际只有50分因为数组开小了……) 考场代码(数组大小已修改) #include <cstdio> #include <cstring> ...

  5. NOIP 2014 提高组 题解

    NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...

  6. 洛谷 P1941 飞扬的小鸟

    洛谷 P1941 飞扬的小鸟 原题链接 首先吐槽几句 noip都快到了,我还不刷起联赛大水题! 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节 ...

  7. [codevs3729]飞扬的小鸟

    [codevs3729]飞扬的小鸟 试题描述 输入 输出 输出文件名为 bird.out. 共两行. 第一行,包含一个整数,如果可以成功完成游戏,则输出 1,否则输出 0. 第二行,包含一个整数,如果 ...

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

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

  9. Codevs 3729 飞扬的小鸟

    飞扬的小鸟 标签 动态规划 NOIp提高组 2014 难度 提高+/省选- 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小 ...

随机推荐

  1. 移动端和PC端页面常用的弹出层

    我们在页面的时候,很多时候用到了弹出层,消息提醒,确认框等等,统一样式的弹出框可以使页面更加优美.在此,我整理一下我们项目的移动端和PC端页面常用的弹出层. 一.移动端 我们需在页面引入弹出框的样式和 ...

  2. [官网]Linux版本历史

    This is a list of links to every changelog. https://kernelnewbies.org/LinuxVersions 总结一下 2.6.x 存在了八年 ...

  3. CIFS 与 SMB 有什么区别?

    CIFS 与 SMB 有什么区别? https://www.getnas.com/2018/11/30/cifs-vs-smb/ 网络协议 一知半解 学习一下挺好的.. 记得 win2019 已经废弃 ...

  4. python raise

    当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常.一旦执行了raise语句,raise后面的语句将不能执行.   演示raise用法 try: s = None if s ...

  5. 如何在mac下安装php

    步骤如下: 1.下载php源码并解压 2.进入php源码并configure 3.安装openssl 4.sudo make及make test 5.sudo make install 具体命令如下: ...

  6. MIUI(ADUI)关闭广告推送步骤方法

    MIUI自从到了版本MIUI8之后,系统增加了各种推送,让人们所诟病.很多消费者因为这个原因,不再考虑小米手机,尽管小米手机确实很便宜. 下面就说一下如何关闭所有的MIUI 8的广告推送.方法源自MI ...

  7. jedis集群版应用

    1.pom文件添加依赖: 2.创建配置文件 <!-- jedis集群版配置(JedisCluster通过构造传参(2个参数)) --> <bean id="redisCli ...

  8. codeforces534B

    Covered Path CodeForces - 534B The on-board computer on Polycarp's car measured that the car speed a ...

  9. nginx POSTREAD阶段模块

    L:50 Realip模块 需要将--with-http_realip_model 编译进Nginx 因为nginx有可能有反向代理 获取到的客户端ip就不是原用户IP了 X-Forwarded-Fo ...

  10. Civil 3D 2017本地化中VBA程序移植到2018版中

    中国本地化包简直就是一块鸡肋, 但对于某些朋友来说还真离不了: 可惜中国本地化包的推出一直滞后, 在最新版软件出来后1年多, 本地化还不一定能够出来, 即使出来了, 也只能是购买了速博服务的用户才能得 ...