题目描述

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

跳房子的游戏规则如下:

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

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

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

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

输入格式:

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

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

输出格式:

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

输入输出样例

输入样例#1:

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

输出样例#1:
2
输入样例#2:

7 4 20
2 6
5 -3
10 3
11 -3
13 1
17 6
20 2
输出样例#2:
-1

说明

【输入输出样例 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 说明

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

本题共 10 组测试数据,每组数据 10 分。

对于全部的数据满足 1≤n≤500000,1≤d≤2000,1≤x_i,k≤109,∣si∣<1051 ≤ n ≤ 500000, 1 ≤ d ≤2000, 1 ≤ x_i, k ≤ 10^9, |si| < 10^51≤n≤500000,1≤d≤2000,1≤x_i,k≤109,∣si∣<105 。

对于第 1, 2 组测试数据, n ≤ 10;

对于第 3, 4, 5 组测试数据, n ≤ 500

对于第 6, 7, 8 组测试数据, d = 1

Solution

首先看到这个题目,很容易看出答案的单调性,所以果断上二分,那么如何CHECK<br>
看起来貌似很像 跳石头 和 乌龟棋之类的<br>
于是很容易想到DP来CHECK,具体请看标程,注意需要单调队列优化,如果不想用,告诉大家一个小技巧<br>
因为答案不会太大,所以二分时右端点设成 1005 就好了,这样不需要单调队列优化。

上标程

#include<bits/stdc++.h>
using namespace std;
const long long Maxn=500005;
const long long INF=1000000005;
long long n,k;
int d;
struct house
{long long x,s;
}Lemon[Maxn];
int q[Maxn],head,t;
long long f[Maxn];
void Push(int x)
{ while(f[q[t]]<=f[x]&&t>=head) t--; q[++t]=x;
}
bool check(int mid)
{int p=0;head=1;t=0;q[head]=0;for(int i=1;i<=n;i++)f[i]=-INF;for(long long i=1;i<=n;i++){f[i]=-INF;while(Lemon[i].x-Lemon[p].x>=max(d-mid,1)&&p<i) Push(p++);while(Lemon[i].x-Lemon[q[head]].x>d+mid&&head<=t) head++;//单调队列优化if(head>t||f[q[head]]==-INF) continue; else f[i]=f[q[head]]+Lemon[i].s; if(f[i]>=k) return 1;}return 0;
}
int main()
{cin>>n>>d>>k;for(long long i=1;i<=n;i++)scanf("%lld%lld",&Lemon[i].x,&Lemon[i].s);Lemon[0].x=0;Lemon[0].s=0;long long r=Lemon[n].x+1,l=0,mid,ans=-1;while(r>l)//二分答案{mid=(r+l)/2;if(check(mid)) {ans=mid; r=mid;}else l=mid+1;}cout<<ans;return 0;
}

转载于:https://www.cnblogs.com/Le-mon/p/9093579.html

【洛谷】3957 跳房子相关推荐

  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. 微服务部署HTTP反向代理、负载均衡工具Træfɪk
  2. 汤家凤高等数学基础手写笔记-极限与连续
  3. 编程之美-队列中取最大值操作问题
  4. boost::contract模块实现虚拟可选结果的测试程序
  5. xavier初始化_深入解读xavier初始化(附源码)
  6. 大数据之MySql笔记-0916
  7. TPAMI 2021 华为诺亚悉尼大学陶大程团队提出多功能卷积,助力轻量级网络
  8. Why String is Immutable or Final in Java
  9. 洛希极限 (10 分)
  10. 网警已进入本群代码_“闯黄灯”记3分罚200元?沈阳网警这样回应
  11. android n sdk,Android SDK (phần 6) pptx
  12. 卸载无线网卡驱动rtl8192eu-dkms
  13. 填空什么的月牙_部编一年级上册语文第四单元知识梳理填空,附答案
  14. 离散数学-2 命题逻辑等值演算
  15. Linux文件加密系统-eCryptfs
  16. python早读读后感_《学习Python》读后感摘抄
  17. 呕心沥血整理出的史上最简单的IntelliJ IDEA教程,快来看哟!
  18. Android 蓝牙系统打开蓝牙源码分析(一)--- 全网最详细
  19. 先验分布与后验分布,认真看看这篇
  20. django框架中嵌入容联云sdk实现短信发送接口

热门文章

  1. c 语言加壳项目,C 加壳工具,快速完成加密保护
  2. org.apache.ibatis.binding.BindingException: Type interface com.java.mapper.UserMapper is not known t
  3. 知乎周源:知识变现背后的信息逻辑
  4. Java程序员必读书籍推荐
  5. python小球弹弹弹_python3.6使用tkinter实现弹跳小球游戏
  6. 南邮NOJ2029节奏大师
  7. 太原理工大学信息与计算机学院桑胜波,Direction leader: Sang Shengbo
  8. MsXml创建和解析XML示例
  9. pthread编译时报错的解决方法
  10. Android的发布与更新