• 题目

    • 问题描述
    • 输入格式
    • 输出格式
    • 输入输出样例1
    • 输入输出样例1 说明
    • 输入输出样例2
    • 输入输出样例2 说明
    • 输入输出样例3
    • 数据规模与约定
  • 分析
    • 二分答案
    • DP
    • 单调队列优化
  • 代码

题目

跳房子

  • (jump.cpp/c/pas)
  • 2S
  • 10 * 10’
  • 传统
  • 256MB

【问题描述】

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

在地面上确定一个起点,然后在起点右侧画n 个格子,这些格子都在同一条直线上。每
个格子内有一个数字(整数),表示到达这个格子能得到的分数。玩家第一次从起点开始向
右跳,跳到起点右侧的一个格子内。第二次再从当前位置继续向右跳,依此类推。规则规定:
玩家每次都必须跳到当前位置右侧的一个格子内。玩家可以在任意时刻结束游戏,获得的分
数为曾经到达过的格子中的数字之和。

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

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

【输入格式】

输入文件名为jump.in。
第一行三个正整数n,d,k,分别表示格子的数目,改进前机器人弹跳的固定距离,以
及希望至少获得的分数。相邻两个数之间用一个空格隔开。
接下来n 行,每行两个正整数xi ,si,分别表示起点到第i个格子的距离以及第i个格子的
分数。两个数之间用一个空格隔开。保证xi按递增顺序输入。

【输出格式】

输出文件名为jump.out。
共一行,一个整数,表示至少要花多少金币来改造他的机器人。若无论如何他都无法获
得至少k 分,输出-1。

【输入输出样例1】

jump.in
7 4 10
2 6
5 -3
10 3
11 -3
13 1
17 6
20 2
jump.out
2
见选手目录下的jump/jump1.in 和jump/jump1.ans。

【输入输出样例1 说明】

花费 2 个金币改进后,小R 的机器人依次选择的向右弹跳的距离分别为2,3,5,3,4,
3,先后到达的位置分别为2,5,10,13,17,20,对应1, 2, 3, 5, 6, 7 这6 个格子。这些格
子中的数字之和15 即为小R 获得的分数。

【输入输出样例2】

jump.in
7 4 20
2 6
5 -3
10 3
11 -3
13 1
17 6
20 2
jump.out
-1
见选手目录下的jump/jump2.in 和jump/jump2.ans。

【输入输出样例2 说明】

由于样例中7 个格子组合的最大可能数字之和只有18 ,无论如何都无法获得20 分。

【输入输出样例3】

见选手目录下的jump/jump3.in 和jump/jump3.ans。

【数据规模与约定】

本题共10 组测试数据,每组数据10 分。对于全部的数据满足1 ≤ n ≤ 500000, 1 ≤ d ≤
2000, 1 ≤ xi , k ≤ 109, |si| < 105。
对于第1,2 组测试数据,n ≤ 10;
对于第3,4,5 组测试数据,n ≤ 500
对于第6,7,8 组测试数据,d = 1

分析

二分答案

显然答案有单调性,所以二分答案

有这么简单?显然作为第4题,它不会这么简单:怎么判断答案大了还是小了?

DP

肯定不能贪心,发现它完全可以DP,还是线性的。
f[i]f[i]表示跳前ii个格子,且停在第ii个格子最大分数;
num[i]num[i]表示第ii个格子的分数。
于是:f[i]=max(f[j] | 从j可以跳到i)+num[i]f[i]=max(f[j]\ |\ 从j可以跳到i)+num[i]

这样就可以判断答案的合法性了,有这么简单,它不会这么简单,算一下时间复杂度:Θ(log2NN2)\Theta(log_2N N^2),光是N2N^2就可以让你止步在第5组数据了……

单调队列优化

所以,要优化DP……

发现转移式中的f[j]f[j]是随ii的右移而右移的,即:如果每次都枚举,会重复枚举很多个f[j]f[j],如果我们把这些f[j]f[j]保存下来不就好了吗,所以需要用单调队列

单调队列是一个双向队列(deque),即两头都可以push或者pop等。
怎么优化呢?假设此时队列里面已经有了f[i−1]f[i-1]所枚举过的f[j]f[j],要得到f[i]f[i]所对应的max(f[j])max(f[j]),只需要把新加入的加入,不符合条件的扔出去即可。

发现,对于格子jj,如果j到i的距离已经大于了机器人能跳的最大距离,它就可以扔掉了,因为ii是一直往右走的。

对于格子jj,如果jj到ii的距离大于等于机器人能跳的最小距离,显然f[j]f[j]是可以入队的,但是在把f[j]f[j]放进去之前要和队列最后面的元素f[k]f[k]比较,如果f[k]<f[j]f[k],f[k]f[k]就可以直接pop掉了。

于是,这个队列中的元素一定是下降的(注意不是优先队列,优先队列是一个堆),使用时直接取front即可。

事实上,在单调队列中存下标即可。

代码

可以直接用STL中的deque(双向队列)。

#include<deque>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{int x=0,f=1;char s=getchar();while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}return x*f;
}#define MAXN 500000
int pos[MAXN+5],num[MAXN+5];
int N,D,K;
int f[MAXN+5];bool dp_check(int g)
{deque<int> Q;memset(f,0,sizeof f);int Lg=max(1,D-g),Rg=D+g;int Now=0;//Now为现在新加入Q的格子//printf("%d\n",g);for(int i=1;i<=N;i++){while(pos[Now]+Lg<=pos[i]){while(!Q.empty()&&f[Q.back()]<=f[Now])//注意,!Q.empty一定要写在前面Q.pop_back();Q.push_back(Now++);//不一定只放一个}while(!Q.empty()&&pos[Q.front()]+Rg<pos[i])//把队列前面不需要的pop掉Q.pop_front();if(!Q.empty()) f[i]=f[Q.front()]+num[i];//直接取出最前面的else f[i]=-0x3f3f3f3f;//否则表示到不了这个格子//printf("  %d\n",f[i]);if(f[i]>=K) return 1;//随时都有可能>=K,而不是只在循环玩后比较f[N]与K}return 0;
}int main()
{freopen("jump.in" ,"r", stdin);freopen("jump.out","w",stdout);N=read(),D=read(),K=read();long long sum=0;for(int i=1;i<=N;i++){pos[i]=read(),num[i]=read();if(num[i]>0) sum+=num[i];}if(sum<K){printf("-1");return 0;}int left=0,right=pos[N];//答案的最大值是pos[N],而不是N!while(left<right){int mid=(left+right)>>1;if(dp_check(mid)) right=mid;else left=mid+1;//mid也不符合条件,所以是mid+1}printf("%d",right);
}

NOIP2017普及组★跳房子相关推荐

  1. [NOIP2017 普及组]跳房子 【题解】

    题目背景 NOIP2017 普及组 T4 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 n n ...

  2. noi2017初赛c语言试题,NOIP2017普及组初赛试题及答案

    原标题:NOIP2017普及组初赛试题及答案 清北学堂信息学金牌教研团今天为学生们整理了NOIP2017普及组初赛试题及答案,供学生们参考哦! --此文2100多文字,大概需要60分钟看完 一.单项选 ...

  3. P3954 [NOIP2017 普及组] 成绩(python3实现)

    https://www.luogu.com.cn/problem/P3954 """P3954 [NOIP2017 普及组] 成绩 https://www.luogu.c ...

  4. 信息学奥赛一本通 1414:【17NOIP普及组】成绩 | 洛谷 P3954 [NOIP2017 普及组] 成绩

    [题目链接] ybt 1414:[17NOIP普及组]成绩 洛谷 P3954 [NOIP2017 普及组] 成绩 [题目考点] 1. 算术表达式 2. 自动类型转换 低精度类型与高精度类型计算结果是高 ...

  5. P3955 [NOIP2017 普及组] 图书管理员C++题解

    洛谷来源:P3955 [NOIP2017 普及组] 图书管理员 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/sol ...

  6. [NOIP2017 普及组] 棋盘

    [NOIP2017 普及组] 棋盘 题目背景 NOIP2017 普及组 T3 题目描述 有一个m×mm \times mm×m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的 ...

  7. P3954 [NOIP2017 普及组] 成绩

    题目背景 NOIP2017 普及组 T1 题目描述 牛牛最近学习了 C++ 入门课程,这门课程的总成绩计算方法是: 总成绩=作业成绩×20%+\times 20\%+×20%+小测成绩×30%+×30 ...

  8. ybt1414 成绩(NOIP2017普及组第1题)

    ybt1414  成绩(NOIP2017普及组第1题) 时空限制    1000ms/64MB 题目描述 牛牛最近学习了C++入门课程,这门课程的总成绩计算方法是: 总成绩=作业成绩×20%+小测成绩 ...

  9. 信息学奥赛一本通 1415:【17NOIP普及组】图书管理员 | 洛谷 P3955 [NOIP2017 普及组] 图书管理员

    [题目链接] ybt 1415:[17NOIP普及组]图书管理员 洛谷 P3955 [NOIP2017 普及组] 图书管理员 [题目考点] 1. 枚举 2. 二分 [解题思路] 解法1:枚举 对于每个 ...

  10. luogu3955 图书管理员(NOIP2017普及组第2题)

    luogu3955 图书管理员(NOIP2017普及组第2题) 时空限制    1000ms/128MB 题目描述 图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个 正整数. ...

最新文章

  1. 多个class相同的input标签 获取当前值!方法!
  2. 关于node-sass安装失败的解决办法
  3. Tasklets 机制浅析
  4. 字符串,枚举,数值之间的转换
  5. 音频光端机简单故障处理
  6. C++ 类模板语法初步01
  7. linux 线程与进程 pid,linux下线程所属进程号问题
  8. 怎样快速画出一个正方体_图形与几何---正方体
  9. 控制for each循环次数_CCF CSP编程题解201312-1:出现次数最多的数
  10. Spring MVC过滤器-委派过滤器代理(DelegatingFilterProxy)
  11. NYOJ4 - ASCII码排序
  12. slider轮播插件的多种写法
  13. java案例代码16-java正则表达式的使用
  14. 2021年老杨通信工程师中级互联网技术视频讲解
  15. PDF转Word时提示有密码两种常用解密技巧分享
  16. latex如何设置字体并加粗_LaTeX字体设置
  17. 文字识别:Tesseract OCR
  18. iosbanner_ios图片的局部拉伸-------App首页banner图的iPhone X适配
  19. 消防工程师 8.4 防排烟系统-联动控制 9. 应急照明和疏散指示系统
  20. 10种招聘数据的采集方法

热门文章

  1. 手把手系列--STM32H750移植FreeRTOS(二)--优化编译速度
  2. linux img文件压缩及解压
  3. js保留2位小数(且四舍五入)
  4. Django基础(16): 模板标签(tags)的介绍及如何自定义模板标签
  5. Redhat8.0安装mariadb
  6. 使用RDLC文件开发报表
  7. Stealing packets
  8. ie8打不开mysql登录_Win7下IE8无法打开https类型的网站解决方法笔记
  9. 【全套攻略】关于建站、服务器、云虚拟主机你想知道的都在这里!
  10. Word(二) Word2016 如何删除页眉的下划线