文章目录

  • 题目描述
  • 解析
  • 代码
  • thanks for reading!

题目描述

洛谷传送门
跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一。
跳房子的游戏规则如下:

在地面上确定一个起点,然后在起点右侧画 n 个格子,这些格子都在同一条直线上。每个格子内有一个数字(整数),表示到达这个 格子能得到的分数。玩家第一次从起点开始向右跳,跳到起点右侧的一个格子内。第二次再从当前位置继续向右跳,依此类推。规则规定:

玩家每次都必须跳到当前位置右侧的一个格子内。玩家可以在任意时刻结束游戏,获得的分数为曾经到达过的格子中的数字之和。

现在小 R 研发了一款弹跳机器人来参加这个游戏。但是这个机器人有一个非常严重的缺陷,它每次向右弹跳的距离只能为固定的 d 。小 R 希望改进他的机器人,如果他花 g 个金币改进他的机器人,那么他的机器人灵活性就能增加 g ,但是需要注意的是,每 次弹跳的距离至少为 1 。具体而言,当 g<d 时,他的机器人每次可以选择向右弹跳的距离为 d-g,d-g+1,d-g+2d,…, d+g-2 , d+g-1, d+gd+g ;否则(当 g≥d 时),他的机器人每次可以选择向右弹跳的距离为 1, 2 , 3 ,…, d+g-2 , d+g-1 , d+g。

现在小 R 希望获得至少 k 分,请问他至少要花多少金币来改造他的机器人。

输入格式
第一行三个正整数 n , d , k ,分别表示格子的数目,改进前机器人弹跳的固定距离,以及希望至少获得的分数。相邻两个数 之间用一个空格隔开。

接下来 n 行,每行两个整数 xi,si ,分别表示起点到第 i 个格子的距离以及第 ii 个格子的分数。两个数之间用一个空格隔开。保证 x i按递增顺序输入。

输出格式
共一行,一个整数,表示至少要花多少金币来改造他的机器人。若无论如何他都无法获得至少 k 分,输出 −1 。

解析

其实不算太难
就是一个滑动窗口的题的改版
细节处理的不够好:

1.二分的上界应该是距离的最大值而不是n!
2.因为s可能很大,所以数组下标不能存具体的s值,而是一个求序号!

代码

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=550050;
int n,d,kk;
int pl[N],v[N];ll dp[N];//dp存序号
ll q[N],st,ed,npl;
bool check(int k){dp[0]=0;for(int i=1;i<=n;i++) dp[i]=-2e15;st=1,ed=0,npl=0;int l1=d+k,l2=max(1,d-k);for(int i=1;i<=n;i++){while(st<=ed&&pl[q[st]]<pl[i]-l1) st++;while(pl[npl]<=pl[i]-l2&&npl<=n){if(pl[npl]<pl[i]-l1){npl++;continue;}while(st<=ed&&dp[q[ed]]<=dp[npl]) ed--;q[++ed]=npl;npl++;}if(st>ed) dp[i]=-2e15;else dp[i]=dp[q[st]]+v[i];} for(int i=1;i<=n;i++){//      printf("i=%d dp=%d\n",i,dp[i]);if(dp[i]>=kk) return true;}return false;
}int main(){scanf("%d%d%d",&n,&d,&kk);for(int i=1;i<=n;i++) scanf("%d%d",&pl[i],&v[i]);check(100);int sst=0,eed=pl[n]+1;while(sst<eed){int mid=(sst+eed)>>1;
//  printf("**ed=%d\n",ed);if(check(mid)) eed=mid;else sst=mid+1;
//      printf("mid=%d st=%d ed=%d\n",mid,st,ed);}//   printf("st=%d\n",st);if(sst==n+1) printf("-1");else printf("%d",sst); return 0;
} /*
50 3 1
49 1 1
26 1 4
6 1 1010 3 1
3 1 1
7 3 2
1 6 5
*/

thanks for reading!

跳房子(ybtoj-单调队列)相关推荐

  1. 洛谷P3957 跳房子(玩转单调队列)

    传送门:跳房子 一.题目描述   二.解题思路 1)分析题目 题意:机器人开始时在0的位置,总共有k个格子,每个格子的分数为,每个格子与原点的距离为 当花费g个金币后,机器人能跳的距离为,也就是说机器 ...

  2. Ybtoj 最优密码 单调队列(浅谈)树状数组 两种解法

    作者:hsez_yyh 链接:https://blog.csdn.net/yyh_getAC/article/details/123956399  来源:湖北省黄石二中竞赛组  著作权归作者所有.商业 ...

  3. 单调队列多重背包时间复杂度O(vn)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 多重背包问题: 有N种物品和容量为V的背包,若第i种物品,容量为v[i],价值为w[i],共有n[i]件.怎样装才能使背包内的物品总价值最大? 网 ...

  4. 洛谷 P2219修筑绿化带 二维单调队列~

    题目链接:https://www.luogu.org/problem/P2219 emmm调了一个上午+中午,fan 题意:从N*M的中找到一个a*b的大矩形和减去a*b中的一个与之不重边界的c*d的 ...

  5. P2216 理想的正方形 单调队列 (二维)

    题目链接:https://www.luogu.org/problem/P2216 题意:求给定n*m的矩形中所有k*k的正方形块中最大值最小值之差(极差)最小 哇,大神的思路真的很帅 单调队列对每一行 ...

  6. 点分治问题 ----------- luoguP2942 [WC2010]重建计划 [点分治 + bfs + 单调队列 + 预处理建树 + 二分 + 01分数规划]

    题目链接 解题思路: 1.对于这个Avgvalue=∑e∈sv(e)∣s∣Avgvalue = \frac{\sum_{e\in s}v(e)}{|s|}Avgvalue=∣s∣∑e∈s​v(e)​ ...

  7. 解题报告:Fake Maxpooling(单调队列求矩阵的和)

    我们不妨先把这个问题中二维的矩阵简化成一维的数列.那么现在的问题就变成了一个求连续的滑动窗口最值问题:给出一个长度为n的数列和一个长度为k(k<n)的窗口,记录滑动窗口位于每个位置下的下的最大值 ...

  8. 0x12.基本数据结构 — 队列与单调队列

    目录 一.队列 0.UVA540 团体队列 Team Queue 1.AcWing 133. 蚯蚓(模拟优先队列) 二 .单调队列 0.AcWing 135. 最大子序和(单调队列) 1.luogu ...

  9. 【题解】P1419 寻找段落(二分+单调队列)难度⭐⭐⭐★

    P1419 寻找段落 首先二分答案,即:二分最大平均值. 我们将a全部减去mid,问题转化为判断是否存在一个长度在s~t范围内的区间它的和为正,如果有说明还有更大的平均值. 用前缀和和单调队列维护. ...

  10. 【数据结构】单调栈和单调队列 详解+例题剖析

    算法:单调栈和单调队列 一.单调栈和单调队列 二.单调栈例题 1.模板题入门 2.不懂不要急,看这道题 三.单调队列例题 1.入门 2.进阶 一.单调栈和单调队列 单调栈和单调队列与普通的栈,队列不同 ...

最新文章

  1. 不要依赖代码中的异常
  2. Go语言字典树定义及实现
  3. Android的沉浸式状态栏与变色状态栏详解
  4. 不定积分24个基本公式_不定积分计算—典型题及解题技巧
  5. 教程:Hibernate,JPA –第1部分
  6. 《AutoCAD 2014中文版超级学习手册》——1.4 配置绘图系统
  7. 谁在使用我的网站——用户分类
  8. Server.MapPath()用法
  9. java 编写浏览器_用Java自己写一个浏览器 —— JavaFX 入门
  10. 拼多多商家刚开店,哪些行为不能做?
  11. 英语计算机的读音,井号'#'用英语怎么说(计算机字符 - 英文读音)
  12. 计算机组成原理之概述篇(一)
  13. 非遗在线商城小程序(后台PHP开发)
  14. What are 20 questions to detect fake data scientists?
  15. Python中程序的基本结构
  16. 信号与槽的Connect详解
  17. IDEA无法自动导包问题
  18. 凡客“小米化”改造:雷军与陈年最基友的商业故事
  19. 成双成对的数,怎么找到落单的那个
  20. 操作系统和磁盘分区及引导

热门文章

  1. 51单片机外部地址c语言,cx51与c语言对单片机内部和外部资源变量和地址的定义是否兼容?为什么...
  2. oracle 大页配置,【Oracle】Oracle如何开启大页
  3. php 重定向数据不丢失,PHP重定向如何实现数据不丢失?
  4. .net html5页面缓存,详解HTML5中的manifest缓存使用
  5. qtabwidget设置tab高度_VC|富文本编辑框CRichEditCtrl的字体与段落设置
  6. 香肠派对电脑版_香肠派对先行服s7赛季下载-香肠派对先行服s7赛季最新版下载...
  7. 怎么用ai做出适量插画_怎么用最简单的方法,做出最炫酷的数据可视化图表?...
  8. krc 编辑 linux,Linux网络编程
  9. 游戏设计与计算机,RPG游戏设计与实现-数学与计算机系.doc
  10. aspose excel中文文档_除了VBA,还有哪些编程语言可以操作Excel文件?