NOIP 飞扬的小鸟 题解
题目描述
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 飞扬的小鸟 题解的更多相关文章
- [DP]Luogu 2014NOIP提高组 飞扬的小鸟题解
2014NOIP提高组飞扬的小鸟题解 题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一 ...
- noip飞扬的小鸟
题解: 挺简单的题目 f[i][j]表示x坐标为i,y坐标为j的最小值 会发现那个东西是个完全背包 从f[i][j-a[i]]转移一下就是O(1)转移的了 另外上界为m这个要特判一下 我把sum[a[ ...
- 洛谷 P1194 飞扬的小鸟 题解
题面 这道题是一道隐藏的比较深的DP(我太蒟蒻了!) 设f[i][j]表示到第i列时高度为j的最少步数是多少: 求上升时的方案就是一个完全背包!,求下降时的方案就是一个01背包: 然后处理边界就能A掉 ...
- NOIP 2014飞扬的小鸟(DP优化)
题目链接 飞扬的小鸟 考场的70分暴力(实际只有50分因为数组开小了……) 考场代码(数组大小已修改) #include <cstdio> #include <cstring> ...
- NOIP 2014 提高组 题解
NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...
- 洛谷 P1941 飞扬的小鸟
洛谷 P1941 飞扬的小鸟 原题链接 首先吐槽几句 noip都快到了,我还不刷起联赛大水题! 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节 ...
- [codevs3729]飞扬的小鸟
[codevs3729]飞扬的小鸟 试题描述 输入 输出 输出文件名为 bird.out. 共两行. 第一行,包含一个整数,如果可以成功完成游戏,则输出 1,否则输出 0. 第二行,包含一个整数,如果 ...
- Codevs 3729==洛谷P1941 飞扬的小鸟
P1941 飞扬的小鸟 456通过 2.4K提交 题目提供者该用户不存在 标签动态规划2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 Flappy Bird 是一 ...
- Codevs 3729 飞扬的小鸟
飞扬的小鸟 标签 动态规划 NOIp提高组 2014 难度 提高+/省选- 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小 ...
随机推荐
- Linux的基本解读
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统 而严格来讲,Linux这个词本身只表示Linux内核,但实际上人 ...
- C# Note3:大话Ninject
前言 之所以研究Ninject,是因为初入职在开发XX项目的ComponentService部分时用到了它,一下子发现了它的强大.渐渐地发现在项目中,有时会用到优秀的第三方开源库,这些都是前人智慧的结 ...
- @Param注解
关于mybatis的@Param注解和参数 引用 https://www.cnblogs.com/whisper527/p/6568028.html 薇飘意 1,使用@Param注解 当以下面的方式进 ...
- python 钉钉机器人发送消息
import json import requests def sendmessage(message): url = 'https://oapi.dingtalk.com/robot/send?ac ...
- 在编写wpf界面时候中出现如下错误: 类型引用不明确。至少有两个名称空间(“System.Windows”和“System.Windows”)中已出现名为“VisualStateManager”的类型。请考虑调整程序集 XmlnsDefinition 特性。
wpf中类型引用不明确.至少有两个名称空间(“System.Windows”和“System.Windows”)中已出现名为“VisualState 你是不是用了WPFToolKit?如果是的,那原因 ...
- 皮皮虾FAQ
我们提供的软件,是市场上比较好操作的,如果有其他的软件也是可以使用我们的ip的 Windows 1.windows找不到粘贴的地方 window打开窗口后,请在屏幕右下角找小飞机,右键即可 2.win ...
- 配置 Django
Django项目的设置文件位于项目同名目录下,名叫settings.py.这个模块,集合了整个项目方方面面的设置属性,是项目启动和提供服务的根本保证. 一.简述 settings.py文件本质上是一个 ...
- Android PowerManager电源管理(Android N )
./frameworks/base/core/java/android/os/PowerManager.java该类提供给Application访问电源相关接口. 它的内部类WakeLock是定义的唤 ...
- POJ 2352 树状数组
学习自:链接以及百度百科 以及:https://www.bilibili.com/video/av18735440?from=search&seid=363548948825132979 理解 ...
- 洛谷P2278操作系统
题目 这个题是一个名副其实的考验细节和头脑清醒的一个题. 根据提议我们可以进行分类讨论. 我们用优先队列来模拟CPU,我们可以用在线的算法来写,每次输入一个进程都要判断这个进程是否可以挤掉优先队列里的 ...