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 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小 ...
随机推荐
- vue路由动态过渡效果
不多说,直接上代码 import Vue from 'vue' //引入vue import VueRouter from 'vue-router' //引入路由 Vue.use(VueRouter) ...
- flex实现三栏等分布局
前言 在实际开发中,我们经常会想要实现的一种布局方式就是三栏等分布局,那么我们如何来解决这个问题呢? 解决 方法一:flex 外层容器也就是ul设置display:flex,对项目也就是li设置fle ...
- Angular MVC
<!DOCTYPE html><html ng-app="myApp"><head lang="en"> <meta ...
- MySQL最大连接数设置
在使用MySQL数据库的时候,经常会遇到这么一个问题,就是“Can not connect to MySQL server. Too many connections”-mysql 1040错误,这是 ...
- 【Spring】——声明式事务配置详解
项目中用到了spring的事务: @Transactional(rollbackFor = Exception.class, transactionManager = "zebraTrans ...
- Spring注解 系列之Spring常用注解总结
参考:Spring系列之Spring常用注解总结 (1) Resource 默认是byName的方式进行bean配置,@AutoWired默认是按照byType的方式进行装配bean的:(2)Comp ...
- 集合之LinkedHashSet(含JDK1.8源码分析)
一.前言 上篇已经分析了Set接口下HashSet,我们发现其操作都是基于hashMap的,接下来看LinkedHashSet,其底层实现都是基于linkedHashMap的. 二.linkedHas ...
- Python的web编程
1.urlparse模块 urlparse.urlparse() 将一个url转化为(prot_sch, net_loc, path, params, query, frag)的元组 url ...
- DeepLearning训练方法
1.BN层训练技巧 缩小输入尺寸,这样可以提高batchsize的大小,在BN层适应了该数据集后,固定住BN层参数,放大输入尺寸继续训练 2.语义分割中解决网络输出尺寸与原尺寸的gap方法(如 1/8 ...
- 使用update可以防止并发问题(保证数据的准确性),如果使用select会产生并发问题 ; select * from xx for update 给查询开启事务,默认情况下是没有事物的
update可以锁住数据防止数据被更新且导致与查询出的数据有误差,如果响应条数为0.说明更新失败 则可以回滚事务;