题目描述

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. tomcat7 server.xml max thread

    java - Tomcat - maxThreads vs maxConnections - Stack Overflowhttps://stackoverflow.com/questions/246 ...

  2. winform启动界面+登录窗口

    需求场景:先展示启动界面,然后打开登录界面,如果登录成功就跳转到主界面 首先在程序的入口路径加载启动界面,使用ShowDialog显示界面, 然后在启动界面中添加定时器,来实现显示一段时间的效果,等到 ...

  3. 5 Expressing future time

    1 英语中表达将来的时间有四种主要方式:be going to, will, 现在进行时,一般现在时. 2 Make a prediction. 若要预测将来, 可以使用 be going to 或者 ...

  4. Oracle的数据类型详述

    数据类型 (1)字符型 CHAR: 定长最多(2000字节)特定情况下用 VARCHAR2:可变长度的字符串最多(4000字节) LONG:大文本类型最多(2个G) (2)数值型 NUMBER:可以是 ...

  5. day 7-17 多表查询

    一. 准备表 #部门表 create table dep( id int, name varchar(20) ); #员工表 create table emp( id int primary key ...

  6. Socket和ObjectOutputStream问题

    用到Socket序列化对象网络传输时ObjectOutputStream一直刷新连接 用户代码 package com.jachs.ladflower.ladflower; import java.n ...

  7. select2 简单解析

    <select name="supplierId" class="customsBrokerSel select2 absOpacity select2-hidde ...

  8. WPF Image控件的绑定

    在我们平时的开发中会经常用到Image控件,通过设置Image控件的Source属性,我们可以加载图片,设置Image的source属性时可以使用相对路径也可以使用绝对路径,一般情况下建议使用绝对路径 ...

  9. 怎样利用ADO中的adoquery进行缓存更新?????(100分)

    我用BDE时,用query与updatesql相结合进行缓存更新,但是在ADO中没有updatesql,只有用adoquery,在DBGRID中,用CANCELUPADTE,只能取消一条记录,烦恼不已 ...

  10. webpack安裝和卸載

    webpack安裝和卸載 安裝: 先裝好node和npm: 安裝package.json:進入到根目錄,運行npm init 新建全局webpack:cd退到全局目錄,運行npm install -g ...