一、题目链接:

P1941 [NOIP2014 提高组] 飞扬的小鸟

二、题目大意

游戏界面是一个长为nnn,高为mmm的二维平面,其中有kkk个管道(忽略管道的宽度)。小鸟始终在游戏界面内移动。小鸟从游戏界面最左边任意整数高度位置出发,到达游戏界面最右边时,游戏完成。
小鸟每个单位时间沿横坐标方向右移的距离为111,竖直移动的距离由玩家控制。

  • 如果点击屏幕,小鸟就会上升一定高度xxx,每个单位时间可以点击多次,效果叠加
  • 如果不点击屏幕,小鸟就会下降一定高度yyy

小鸟位于横坐标方向不同位置时,上升的高度xxx和下降的高度yyy可能互不相同。小鸟高度等于000或者小鸟碰到管道时,游戏失败。小鸟高度为mmm时,无法再上升,游戏继续。
现在,请你判断是否可以完成游戏:

  • 如果可以完成,输出最少点击屏幕数
  • 如果不能完成,输出小鸟最多可以通过多少个管道缝隙

数据范围:5≤n≤100005\leq n\leq 100005≤n≤10000,5≤m≤10005\leq m\leq 10005≤m≤1000

三、题目分析

一个很显然的结论是,按照水平方向,后面的状态的值不影响前面的状态,所以这是一个很典型的动态规划问题,再结合一下数据范围大致要求时间复杂度在O(nm)O(nm)O(nm),同样符合动态规划的特征。

下面考虑如何转移,因为题目非常的明确,两层之间只有两种转移方式。所以我们很容易将此问题转化为背包问题进行求解。将高度作为背包的容量,每一层的选择作为物品,点击的次数作为价值。
下降即相当于从背包中取出,而上升则是正常的放入物品。由于题目要求,上升是可以累计多次点击来上升的。所以下降采用010101背包问题的解法,而上升采用完全背包问题的解法。
状态转移方程如下:
dp[i][min(j,m)]=min(dp[i][j−x[i−1]]+1,dp[i−1][j−x[i−1]]+1)dp[i][j]=min(dp[i][j],dp[i−1][j+y[i−1]])\begin{gather} dp[i][min(j,m)]=min(dp[i][j-x[i-1]]+1,dp[i-1][j-x[i-1]]+1)\\ dp[i][j]=min(dp[i][j],dp[i-1][j+y[i-1]]) \end{gather} dp[i][min(j,m)]=min(dp[i][j−x[i−1]]+1,dp[i−1][j−x[i−1]]+1)dp[i][j]=min(dp[i][j],dp[i−1][j+y[i−1]])​​

四、注意事项:

从某种程度上来讲这是一道很简单的题目,然而它有很多坑:

  • 首先就是状态转移方程的min(j,m)min(j,m)min(j,m),因为题目只说了高度不能超过mmm,不是说当高度j+x[i]>mj+x[i]>mj+x[i]>m时不能点击上升了,而只是点击了之后最多变成m,多余部分舍弃而已。
  • 因为完全背包的问题,上升的方程里有层内转移,而实际上升的过程是在前一层进行的,所以可能存在中间状态非法,但是最终状态成立的情况,所以我们最后转移完之后再将非法状态重置,而不是在一开始不允许非法状态参与转移。
  • 最大的问题还是多重背包的层内转移问题,所以我们不能先转移下降的状态,否则就会变成层与层之间既进行了上升又进行了下降,而这是不允许同时存在的。

五、正解代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>using namespace std;
typedef int ll;
const ll maxn=10010;
const ll maxm=2010;
const ll inf=1e9;
struct node
{ll pos;ll l;ll h;
}pile[maxn];
ll n,m,K;
ll x[maxn],y[maxn];
ll dp[maxn][maxm];//在x=i,y=j位置的最少点击次数
int main()
{memset(pile,0,sizeof(pile));scanf("%d%d%d",&n,&m,&K);for(ll i=0;i<=n-1;i++)scanf("%d%d",&x[i],&y[i]);for(ll i=1;i<=K;i++){node temp;scanf("%d%d%d",&temp.pos,&temp.l,&temp.h);pile[temp.pos]=temp;}for(ll i=1;i<=n;i++)for(ll j=1;j<=m;j++)dp[i][j]=inf;for(ll i=1;i<=m;i++)dp[0][i]=0;ll ans=inf,Max=0;for(ll i=1;i<=n;i++){for(ll j=x[i-1]+1;j<=m+x[i-1];j++){ll act=min(m,j);dp[i][act]=min(dp[i][act],dp[i-1][j-x[i-1]]+1);dp[i][act]=min(dp[i][act],dp[i][j-x[i-1]]+1);}for(ll j=1;j<=m;j++)if(!(pile[i].pos==0 || (j>pile[i].l && j<pile[i].h)))dp[i][j]=inf;for(ll j=1;j<=m;j++)if(j+y[i-1]<=m)dp[i][j]=min(dp[i][j],dp[i-1][j+y[i-1]]);for(ll j=1;j<=m;j++){if(!(pile[i].pos==0 || (j>pile[i].l && j<pile[i].h)))dp[i][j]=inf;if(dp[i][j]!=inf)Max=max(Max,i);if(i==n && dp[i][j]!=inf)ans=min(ans,dp[i][j]);}}if(ans==inf){printf("0\n");ll fina=0;for(ll i=1;i<=Max;i++)if(pile[i].pos!=0)fina++;printf("%d\n",fina);}elseprintf("1\n%d\n",ans);return 0;
}

P1941 [NOIP2014 提高组] 飞扬的小鸟——解题报告相关推荐

  1. P1941 [NOIP2014 提高组] 飞扬的小鸟

    题目来源 [NOIP2014 提高组] 飞扬的小鸟 - 洛谷 题目考点 动态规划,dp    枚举,暴力    背包 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点 ...

  2. NOIP2014提高组A.石头剪刀布(解题报告)

    [题目描述] 在<生活大爆炸>第二季第 8 集中出现了一种石头剪刀布的升级版游戏.升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势: 斯波克:<星际迷航>主角之一. ...

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

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

  4. C++——NOIP提高组——飞扬的小鸟

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

  5. nowcoder 提高组模拟赛 选择题 解题报告

    选择题 链接: https://www.nowcoder.com/acm/contest/178/B 来源:牛客网 题目描述 有一道选择题,有 \(a,b,c,d\) 四个选项. 现在有 \(n\) ...

  6. 飞扬的小鸟java分析_刷题总结——飞扬的小鸟(NOIP2014提高组)

    题目: 题目背景 NOIP2014 提高组 Day1 试题. 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面 ...

  7. 【NOIP2014提高组】飞扬的小鸟

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

  8. 【洛谷】P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布(详细代码)

    [洛谷]石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一 样,则不分胜负.在<生活大爆炸>第二季第8集中出现了一种石头剪刀布的升级版游戏. 1.[题目描述] 2 ...

  9. 【NOIP2014提高组】石头剪子布

    题目背景 NOIP2014提高组 Day1 试题. 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第 8 集中 ...

最新文章

  1. Manifest merger failed Suggestion: add 'tools:replace=“Android:value”' to meta-data element at And
  2. 5.8 程序示例--线性分类-机器学习笔记-斯坦福吴恩达教授
  3. mysql 快速升级_MySQL 4到5的快速升级
  4. Python列表:list
  5. 2019春晚百度App日活破3亿 百度系App霸榜AppStore
  6. 2208: [Jsoi2010]连通数(Trajan+bitset)
  7. 中国银行手机银行登入显示服务器,中国银行手机银行登录指南
  8. 服务器上Dll文件读取失败,解决开机出现dll文件加载失败的方法
  9. ngod规范_[转载]NGOD一些感悟
  10. 新浪微博开放平台开发
  11. 学号20189220 2018-2019-2 《密码与安全新技术专题》第四周作业
  12. laravel 输出最后执行sql 附:whereIn用法
  13. 爬虫 | Python爬取20000+猫眼影评实战
  14. 2016这一年读过的那些书
  15. 使用iperf测试网络性能
  16. ad hoc java_Java并发编程--线程封闭(Ad-hoc封闭 栈封闭 ThreadLocal)
  17. vscode在windows端远程连接ubuntu工作站
  18. 量化投资:为什么在中国发展之路任重而道远
  19. 520告白日~情人节特献3D玫瑰花源码
  20. C++ 如何加载lib

热门文章

  1. 安卓 文本框怎么贴近边缘_flash怎么设置帧频-Adobe flash修改帧频的方法
  2. ARAP(As-Rigid-As-Possible)变形算法
  3. Java 使用 JDBI 库访问MySQL 数据库
  4. 养殖户怎么利用生猪期货套期保值(生猪企业套期保值的一些思路)
  5. galaxy buds耳机一只耳机断开连接
  6. 食物链 (POJ-1182)
  7. Scala和liJ IDJDK集成IntelEA开发工具配置
  8. VMware收费太贵?试试这款更轻量级的虚拟机,完全免费!
  9. Partial Dependence and Individual Conditional Expectation plots
  10. alipay本地jar安装