洛谷 P3957 跳房子

Description

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

    跳房子的游戏规则如下:

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

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

    现在小 R 研发了一款弹跳机器人来参加这个游戏。但是这个机器人有一个非常严重的缺陷,它每次向右弹跳的距离只能为固定的 d 。小 R 希望改进他的机器人,如果他花 g 个金币改进他的机器人,那么他的机器人灵活性就能增加 g ,但是需要注意的是,每 次弹跳的距离至少为 111 。具体而言,当 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 分,请问他至少要花多少金币来改造他的机器人。

Input

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

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

Output

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

Sample Input

7 4 10
2 6
5 -3
10 3
11 -3
13 1
17 6
20 2

Sample Output

2

题解:

  • 单调队列 + 二分。
  • 显然这题是一个dp。但是n的范围太大,肯定要用单调队列来优化。
  • 然后对于变量g,很容易想到二分枚举。
  • 思路就是这样,一眼秒。
  • 然后我交了5次艹
  • 难度在于此题单调队列不像以往的题目是一格一格的挪动,而是一段一段的挪动。如果一格一格的挪动数组开不下,时间也过不去。
  • 所以每次都尝试添加一个格子(而不是一个位置)。
  • 框定区间的左端点一直往右走直到走到一个格子的位置 >= 当前位置 - g - d。
  • 框定区间的右端点一直往右走直到走到一个格子的位置 <= min(当前位置 - 1, 当前位置 - d + g)
  • 那么走完之后框定区间内的格子就是可以转移到当前格子的格子,进行转移即可。
  • 注:往右走一下是走到下一个格子的位置(而不是走到下一个位置)
#include <iostream>
#include <cstdio>
#include <deque>
#define int long long
#define N 500005
#define inf 100000000000ll
using namespace std;struct Node {int val, pos;};
struct A {int val, pos;} a[N];
int n, d, k, sum;
int dp[N];
deque<Node> deq;int read()
{int x = 0, f = 1; char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}return x *= f;
}bool check(int g)
{int dfn = 0;deq.clear();for(int i = 1; i <= n; i++){int pos = a[i].pos;while(deq.size() && deq.front().pos < pos - g - d) deq.pop_front();while(1){if(a[dfn].pos < pos - g - d) dfn++;else if(a[dfn].pos >= pos - g - d && a[dfn].pos <= min(pos - 1, pos - d + g)){int val = dp[dfn];while(deq.size() && deq.back().val <= val) deq.pop_back();deq.push_back((Node){val, a[dfn++].pos});}else break;}if(!deq.size()) dp[i] = -inf;else dp[i] = deq.front().val + a[i].val;if(dp[i] >= k) return 1;}return 0;
}signed main()
{cin >> n >> d >> k;for(int i = 1; i <= n; i++){a[i].pos = read();a[i].val = read();if(a[i].val > 0) sum += a[i].val;}if(sum < k) {cout << -1; return 0;}int l = 0, r = inf, ans;while(l <= r){int mid = (l + r) >> 1;if(check(mid)) r = mid - 1, ans = mid;else l = mid + 1;}cout << ans;return 0;
}

转载于:https://www.cnblogs.com/BigYellowDog/p/11518797.html

洛谷 P3957 跳房子相关推荐

  1. [洛谷P3957] 跳房子

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

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

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

  3. 洛谷 Golden Sword(dp,优先队列优化【含板子】)|| 补充练习:洛谷 跳房子

    题目链接: 「SWTR-03」Golden Sword - 洛谷 思路: 设表示放第i个原料,锅里共有 j 个时的耐久度之和. 容易知道dp方程为,其中 这样就可以写出暴力dp的代码如下:(需要枚举i ...

  4. 信息学奥赛一本通 1890:【15NOIP提高组】跳石头 | 洛谷 P2678 [NOIP2015 提高组] 跳石头

    [题目链接] ybt 1890:[15NOIP提高组]跳石头 洛谷 P2678 [NOIP2015 提高组] 跳石头 ybt 1247:河中跳房子 OpenJudge NOI 1.11 10:河中跳房 ...

  5. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  6. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  7. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  8. 洛谷P2763 试题库问题

    题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...

  9. 动态规划——洛谷_P1057传球游戏

    题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...

  10. 洛谷P1417 烹调方案

    洛谷P1417 烹调方案 如果是一般的01背包的话 选的先后是没关系的 但是这题选的先后是有关系的,因为他的价值是随着时间而变化的, 而你的01背包是做不到先选2再选1的 那么我们就跟国王游戏一样 用 ...

最新文章

  1. Android系统源码导入Android studio
  2. oracle取消180天过期,Oracle密码过期如何取消密码180天限制及密码180天过期,账号锁住的问题...
  3. CCF 2020年题目题解 - Python
  4. PhotoSwipe 图片浏览插件使用方法
  5. [大数据之Yarn]——资源调度浅学
  6. Cypress 的条件测试
  7. oracle同一个示例两个用户的数据同步_分享两个shell脚本--一键统计Oracle数据库用户信息...
  8. C++ 基类和派生类的析构函数
  9. 马云入选全球“十大思想者”,成唯一获选的中国企业家
  10. Tenserflow 情感分类
  11. 家谱排版一般用什么软件
  12. 【ICML2018】63篇强化学习论文全解读
  13. 三大视角,聊聊我眼中的广告系统
  14. 小米手机系统好牛,真是国产系统的佼佼者
  15. css如何改变视频大小,调整视频的大小取决于屏幕尺寸少用CSS
  16. No 和 Not 的区别
  17. 自动化篇 - 为闲鱼制作一个客服机器人
  18. RC延时电路简要分析
  19. 机器学习与分布式机器学习_机器学习应运而生
  20. 量化分析师的Python日记【第3天:一大波金融Library来袭之numpy篇】

热门文章

  1. 基金实时盈亏展现的接口和网页 java
  2. 元宇宙专题003 | 如何才能抢先一步,各个省市元宇宙布局抢先看
  3. DDoS攻击:无限战争
  4. 【Nodejs】732- 我为 Express 开了外挂
  5. 如何安装 elasticsearch-head 插件?
  6. go的close函数理解
  7. 服务器共享文件打开未响应,win7共享文件夹会话未响应
  8. python调用foxmail 发邮件_使用Python发送邮件
  9. IPQ4xx Ethernet Analysis
  10. Confluence 更改数据库地址