\(\color{red}{\mathcal{Description}}\)

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

跳房子的游戏规则如下:

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

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

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

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

\(\color{red}{\mathcal{Input\ Format}}\)

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

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

\(\color{red}{\mathcal{Output\ Format}}\)

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

\(\color{red}{\mathcal{DataSize\ Agreement}}\)

对于全部的数据满足 \(1 ≤ n ≤ 500000\), \(1 ≤ d ≤2000\), \(1 ≤ x_i, k ≤ 10^9\), \(|s_i| < 10^5\)

\(\color{red}{\mathcal{Solution}}\)

对于输出 \(-1\) 的情况,就是所有分数为正数的格子加起来都不能达到 \(k\) 分

此题的考点就在于选手对二分答案,以及单调队列优化 \(dp\) 的掌握,二分答案不难想到,在 \(check\) 时用线性 \(dp\),但是这么做只有 \(50\) 分

在设计状态时,令 \(dp[i]\) 表示到第 \(i\) 个格子时能获得的最大分数,则有转移方程如下:

\[dp[i]=max\{dp[j]\}+w[i]\ \ \ \ \ \ (1 \leq i \leq N, pos[i]-maxd\leq j \leq pos[i]-mind)\]

发现只需要转移区间 \([pos[i]-maxd,pos[i]-mind]\) 内 \(dp[j]\) 的最大值即可,所以考虑用单调队列维护此区间内 \(dp[j]\) 的最大值

代码实现不是特别复杂,注意开 \(long\ long\),以及判断格子能否到达的操作

\(\color{red}{\mathcal{Code}}\)

#include <bits/stdc++.h>
#define LL long long
#define reg register
using namespace std;const int kN = 5e5 + 10;
const LL inf = 0x3f3f3f3f3f3f3f3f;LL dp[kN];
int x[kN], w[kN];
int N, D, K, Ans = -1;
deque< LL > q;bool ok(int g) {if (!q.empty()) q.clear();for (reg int i = 0; i <= N; ++i)dp[i] = -inf;int mind = max(1, D - g), maxd = D + g;int las = 0;dp[0] = 0LL;for (reg int i = 1; i <= N; ++i) {while (x[las] < x[i] - maxd) las++;while (x[las] <= x[i] - mind && x[las] >= x[i] - maxd && las < i) {while (!q.empty() && dp[las] >= dp[q.back()]) q.pop_back();q.push_back(las++);}while (!q.empty() && x[q.front()] < x[i] - maxd) q.pop_front();if (!q.empty())dp[i] = dp[q.front()] + w[i];if (dp[i] >= K) return true;}return false;
}int main() {scanf("%d%d%d", &N, &D, &K);LL ck = 0;for (reg int i = 1; i <= N; ++i)scanf("%d%d", &x[i], &w[i]), ck += (w[i] < 0 ? 0 : w[i]);if (ck < K) return puts("-1"), 0;int lb = 0, rb = x[N], Mid;while (lb <= rb) {Mid = (lb + rb) >> 1;if (ok(Mid)) Ans = Mid, rb = Mid - 1;else lb = Mid + 1;}printf("%d\n", Ans);return 0;
}

\(\color{red}{\mathcal{Source}}\)

\(NOIp\ 2017\ PJ\ T4\)

转载于:https://www.cnblogs.com/1miharu/p/11333116.html

[LuoGu] P3957 跳房子相关推荐

  1. [洛谷P3957] 跳房子

    洛谷题目连接:跳房子 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 \(n\) 个格子,这些格 ...

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

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

  3. NOIP普及组历届真题(1997~2018)

    供大家刷题. 先上快捷的查看方式:NOIP普及组历届真题 第二页 来自洛谷--一个很好的刷题网站 剩下是具体题目和难度以及是第几年的题. P1002 过河卒 NOIp普及组 2002 普及- P100 ...

  4. 动态规划--from zpz

    版权声明:copy from zpz,我可能要修改 https://blog.csdn.net/qq_40828060/article/details/83064425 文章目录 前言 记忆化搜索 动 ...

  5. 动态规划,且学且放弃

    文章目录 前言 记忆化搜索 动态规划的基本解题思路 背包问题 01背包 (待处理)P1489 猫狗大战 01背包的空间优化问题 P1048 采药 P1510 精卫填海 P1566 加等式 P1504 ...

  6. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  7. [Luogu] 选学霸

    https://www.luogu.org/problemnew/show/P2170 并查集+DP #include <iostream> #include <cstring> ...

  8. Noip2017 跳房子——普及组

    原题地址(点我) 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 n 个格子,这些格子都在同一条 ...

  9. Luogu 2470 [SCOI2007]压缩

    和Luogu 4302 [SCOI2003]字符串折叠 差不多的想法,区间dp 为了计算方便,我们可以假设区间[l, r]的前面放了一个M,设$f_{i, j, 0/1}$表示区间$[i, j]$中是 ...

  10. 【Luogu】P1613 跑路

    [Luogu]P1613 跑路 一.题目 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资 ...

最新文章

  1. 数据挖掘-matplotlib、numpy、pandas(二)
  2. Sql Server 2008 精简版(Express)和管理工具的安装以及必须重新启动计算机才能安装 SQLServer的问题和第一次使用sqlexpress的连接问题
  3. 第六章连接和分组查询
  4. poj 3101Astronomy(圆周追击+分数最小公倍数)
  5. vscode代码库登录配置_VSCode 配置 Sonar Lint支持代码检查提效
  6. 科室鄙视链最低端,居然是这类人
  7. jQuery源码研究分析学习笔记-回调函数(11)
  8. [机器学习] Ubuntu 软件源更新(校园网)以及问题总结
  9. 通达OA2015 数据选择控件的使用随笔
  10. 人工智能——前言概述
  11. 《计算机网络 自顶向下方法》答案(第七章)
  12. windows7删除计算机管理员权限,win7系统删除C盘文件需要管理员权限的解决方法...
  13. 【萌新笔记】简单记录“智能管家”的设计过程
  14. Autovue Client/Server 性能优化
  15. 赴日研修的发展怎么样
  16. 【二次开发教程】Ai-WB2系列的eclipes搭建环境教程
  17. 美团算法 SP | 三面复盘
  18. 透过Bigbang《花路》销量战绩看QQ音乐的压倒性优势
  19. LAMP网站架构的介绍和搭建
  20. 永磁同步电机准谐振自抗扰电流谐波抑制(QRADRC)的无位置传感器控制

热门文章

  1. 动漫Hello World
  2. 5.秒杀模块-基于redis缓存商品秒杀信息
  3. 局域网https安全证书解决方案mkcert
  4. 石榴——转自田维《花田半亩》
  5. quartus II 9.1的sof和elf 文件合并成JIC文件
  6. Android 高仿微信6.0主界面 带你玩转切换图标变色
  7. java图形编程正三角形_java实现正三角形和到正三角形
  8. 番茄todo服务器维护,番茄ToDo:克服“拖延症”必备高效神器!
  9. Codeforces Round 444 div2 D Ratings and Reality Shows (双指针)
  10. html桌面共享文件夹,win7共享文件夹在哪? win7和win10怎么共享文件夹