本文参考了以下大佬的博客
https://blog.nowcoder.net/n/e2bc6cb5c61a45b1ac6d2502373381e2
题目描述
为了简化问题,我们对游戏规则进行了简化和改编:

  1. 游戏界面是一个长为n,高 为m的二维平面,其中有k个管道(忽略管道的宽度)。

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

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

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

现在,请你判断是否可以完成游戏。如果可以,输出最少点击屏幕数;否则,输出小鸟最多可以通过多少个管道缝隙。
链接:https://ac.nowcoder.com/acm/problem/16496
来源:牛客网
输入
10 10 6
3 9
9 9
1 2
1 3
1 2
1 1
2 1
2 1
1 6
2 2
1 2 7
5 1 5
6 3 5
7 5 8
8 7 9
9 1 3
输出
1
6

dp永远欺我,每次都被dp打倒在地上,这道题的细节多,难度不是特别大,大概的转移方程都是好想的,但是落实到细节写下来,就会发现有很多问题真的没有办法处理。看了大佬的骚操作真的懂了很多。

看看数据大小,基本上可以确定是一个二维的动态规划,于是固定dp[i][j]=k的格式,然后想想二维怎么能够表达清楚当前的状态,我们需要的是最少的点击次数,所以我们的k就可以视为最少的点击次数。然后就剩下了i和j,那很容易就可以猜测到i表示横坐标,j表示纵坐标。
然后这个样子的话,转移方程就可以很轻松的想到当前的状态可以由点击上升或者自由下降来得到,所以
dp[i][j]=min(dp[i-1][j+y[i]],dp[i-1][j+k*x[i]]+k,dp[i][j-x[i]]+1)
这里第三个变量,是考虑是否存在多次点击。
然后问题来了,如果我们枚举i,j,k三个就会超时!然后我们还得考虑边界m的因素。
就需要解决一下这个k产生的问题。
这里我也卡住了,然后去参考了大佬的博客。
大佬的做法:
1.首先无视m边界,然后做上升的转移,就是上面转移放程的后两个。
2.然后处理m边界。
3.然后再处理下降的情况转移,也就是转移情况的第一个。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
const int inf=100000000;
int n,m,k;
struct node {int p,l,h;
};
struct node a[10005];
int x[10005],y[10005];
bool cmp(struct node o,struct node p){return o.p<p.p;
}
int dp[10002][2002];
int main(){#ifdef LOCALfreopen(".\\a.in", "r", stdin);#endifscanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++){scanf("%d%d",&x[i],&y[i]);}for(int i=1;i<=k;i++){scanf("%d%d%d",&a[i].p,&a[i].l,&a[i].h);}sort(a+1,a+k+1,cmp);a[k+1].p=inf;fill(dp[0],dp[0]+10002*2002,inf);for(int i=1;i<=m;i++)dp[0][i]=0;int now=1;for(int i=1;i<=n;i++){for(int j=x[i]+1;j<=m+x[i];j++){dp[i][j]=min(dp[i-1][j-x[i]]+1,dp[i][j-x[i]]+1);}for(int j=m+1;j<=m+x[i];j++){dp[i][m]=min(dp[i][m],dp[i][j]);}for(int j=1;j<=m-y[i];j++){dp[i][j]=min(dp[i][j],dp[i-1][j+y[i]]);}if(a[now].p==i){for(int j=1;j<=a[now].l;j++)dp[i][j]=inf;for(int j=a[now].h;j<=m;j++)dp[i][j]=inf;now++;}}int ans=inf;for(int i=1;i<=m;i++){ans=min(ans,dp[n][i]);}if(ans<inf){printf("1\n%d\n",ans);}else {ans=0;now=1;int flag=0,j;for(int i=1;i<=n;i++){for( j=1;j<=m;j++){if(dp[i][j]<inf)break;}if(j==m+1)break;if(a[now].p==i){now++;ans++;}}printf("0\n%d\n",ans);}return 0;
}

牛客每日一题 飞扬的小鸟相关推荐

  1. 力扣牛客每日刷题(Python解法持续更新)

    力扣牛客每日刷题(持续更新) 初试结束第15天, 之前简单的处理了部分毕设方面的任务, 对接下来的学习做了个简单的规划 决定每天开始刷几道力扣题提高一下算法的理解,不能让之前学的数据结构都忘记了 每道 ...

  2. 【牛客每日一题】4.16 逆序对 ( 数学 , 排列组合 ,快速幂 , 快速乘 )

    [每日一题]逆序对 链接:https://ac.nowcoder.com/acm/problem/14731 来源:牛客网 题目描述 求所有长度为n的01串中满足如下条件的二元组个数: 设第i位和第j ...

  3. 【牛客每日一题】4.15 Treepath 题解(树上dfs/树形DP)

    题目链接:https://ac.nowcoder.com/acm/problem/14248 来源:牛客网 题目描述 给定一棵n个点的树,问其中有多少条长度为偶数的路径.路径的长度为经过的边的条数.x ...

  4. 【牛客每日一题】 4.13 Xorto(前缀异或和,枚举优化/映射)

    链接:https://ac.nowcoder.com/acm/problem/14247 来源:牛客网 题目描述 给定一个长度为n的整数数组,问有多少对互不重叠的非空区间,使得两个区间内的数的异或和为 ...

  5. 【牛客每日一题】tokitsukaze and Soldier 题目精讲 贪心、优先队列、堆

    链接:https://ac.nowcoder.com/acm/problem/50439 来源:牛客网 ACM在线模板 今天才发现牛客推出了一个每日一题的版块,3月25号就开始了,今天才发现,赶紧补救 ...

  6. 牛客每日一题3.31 城市网络 树上倍增

    牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 有一个树状的城市网络(即 n 个城 ...

  7. 牛客每日一题系列(持续更新)

    均由Java实现 题目 奇数位上都是奇数位或偶数位上都是偶数位 有假币 最难的问题 因子个数 分解因数 斐波那契凤尾 剪花布条 客似云来 收件人列表 养兔子 年会抽奖 数据库连接池 mkdir 发邮件 ...

  8. 数学考试(牛客每日一题)变形一

    题意 给一个长度为n的区间,找两个不相交的区间,区间的长度不确定. 思路 这个题和数学考试那一题唯一不同的是区间的长度不确定了. 在数学考试那个题中,我们是记录了一个maxn[i] 来表示i~n中的区 ...

  9. (牛客每日一题)[SHOI2008]小约翰的游戏JOHN(Anti-Nim)

    这是一道裸Anti-Nim游戏 先手必胜条件(满足下面两个其中一个就行): *每一块石子的数量都为1,且总SG值为0时 *至少有一块石子的数量大于1,且 总SG值不为0时 #include <b ...

  10. 『牛客|每日一题』走迷宫

    ​ 活动地址:CSDN21天学习挑战赛

最新文章

  1. 我们期待的TensorFlow 2.0还有哪些变化?
  2. Java多线程闲聊(六):synchronized关键字
  3. java环境安装之不能安装exe文件
  4. java web项目里ehcache.xml的参数说明
  5. 模块化数据中心还需精工细作
  6. 如何使用 ABAP 把多个文件打成一个 zip包 -利用 ABAP 标准工具类 cl_abap_zip
  7. Andorid之华为手机开发模式不打印日志
  8. gsettings-desktop-schemas : 破坏: mutter (< 3.31.4) 但是 3.28.4-0ubuntu18.04.2 正要被安装解决方案
  9. MyCat分布式数据库集群架构工作笔记0022---高可用_单表存储千万级_海量存储_分表扩展分片枚举
  10. 『Linux』ArchLinux与VirtualBox的结合「二」
  11. 两种改变 Windows Vista UI语言的途径
  12. 2022年最值得学习的5款开源Java框架
  13. 机器学习笔记 - 什么是联合概率分布?
  14. ap启动失败 ensp_eNSP模拟WLAN——上线华为真实AP的方法及配置
  15. 简述 matlab 命令窗的主要作用,matlab复习
  16. 【转】关于ATSC与DVB的比较
  17. 职场低情商就这三句话
  18. Linux内网离线安装nginx(rpm包安装方式)
  19. 贪婪算法-Greedy algorithm
  20. URL解析过程和浏览器渲染机制【面试必问、深入解析 下一次再也不怕面试官问这个问题】

热门文章

  1. PS CC2018安装及破解方法
  2. Invalid bound statement (not found): org.seckill.dao.Suc
  3. matlab对三维矩阵求和,【求助】多维矩阵求和运算!!
  4. 【证明】欧拉公式(泰勒展开)
  5. 遇见心想事成的自己……
  6. Joplin使用坚果云WebDAV同步存在的问题以及解决办法
  7. 电脑壁纸桌面放计算机,电脑壁纸
  8. 油田智能化远程监控系统_油气田长停井图像远程传输监控系统
  9. 又一“P8”栽了,约炮成瘾出轨多人,阿里:已劝退!
  10. win10 加快开机速度