前言:把鸽了1个月的博客补上

-----------------

题目链接

题目大意:机器人的灵敏性为$d$。每次可以花费$g$个金币来改造机器人,那么机器人向右跳的范围为$[min(d-g,1),max(d+g,x[n])]$。每个点都有分数$w[i]$。问至少花费多少金币得到分数$k$?

首先,如果用$g$个金币能满足条件,那么$g+1$也能。显然我们要最大值最小,所以我们不妨二分$g$,来求得满足条件的$g$的最小值。

普通的dp应该还是比较好写的。可以拿60pts.

bool check(int g)
{
for (int i=;i<=n;i++) f[i]=-0x3f3f3f3f;f[]=;
int rpos=d+g,lpos=max(d-g,);
for (int i=;i<=n;i++)
{
for (int j=i=;j>=;j--)
{
if (x[i]-x[j]<lpos) continue;
if (x[i]-x[j]>rpos) break;
f[i]=max(f[i],f[j]+w[i]);
if (f[i]>=k) return ;
}
}
return ;
}

对于每一个i,都有一定的可取范围(l,r)。注意到l,r都是单调递增的,且dp方程为$f[i]=max(f[j])+w[i]$,我们可以尝试用单调队列优化。时间复杂度$O(n)$。

bool check(int g)
{
memset(q,,sizeof(q));
memset(f,0x80,sizeof(f));f[]=;
int l=,r=,j=;
int L=d-g,R=d+g;
if (L<) L=;
for (int i=;i<=n;i++)
{
while(x[i]-x[j]>=L&&j<i)
{
if (f[j]!=neInf)//f[j]必须是已经更新过的
{
while(l<=r&&f[q[r]]<=f[j]) r--;//把劣于f[j]的决策排除,因为无论如何都不可能选择它们
q[++r]=j;//入列
}
j++;
}
while(l<=r&&x[i]-x[q[l]]>R) l++;//把不满足条件的排除
if (l<=r) f[i]=f[q[l]]+s[i];//队首一定是最优选择
}
int num=neInf;
for (int i=;i<=n;i++) num=max(num,f[i]);
if (num>=k) return ;
else return ;
}

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const long long neInf=0x8080808080808080;
int f[],n,d,k;
int q[];
int x[],s[],sum,aleft,aright,ans;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if (ch=='-') f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
bool check(int g)
{
memset(q,,sizeof(q));
memset(f,0x80,sizeof(f));f[]=;
int l=,r=,j=;
int L=d-g,R=d+g;
if (L<) L=;
for (int i=;i<=n;i++)
{
while(x[i]-x[j]>=L&&j<i)
{
if (f[j]!=neInf)
{
while(l<=r&&f[q[r]]<=f[j]) r--;
q[++r]=j;
}
j++;
}
while(l<=r&&x[i]-x[q[l]]>R) l++;
if (l<=r) f[i]=f[q[l]]+s[i];
}
int num=neInf;
for (int i=;i<=n;i++) num=max(num,f[i]);
if (num>=k) return ;
else return ;
}
signed main()
{
n=read(),d=read(),k=read();
for (int i=;i<=n;i++)
{
x[i]=read(),s[i]=read();
if (s[i]>) sum+=s[i];
}
aright=max(x[n],d);
if (sum<k){
cout<<-;
return ;
}
while(aleft<=aright)
{
int mid=(aleft+aright)>>;
if (check(mid)) ans=mid,aright=mid-;
else aleft=mid+;
}
cout<<ans;
return ;
}

【NOIP2017】跳房子 题解(单调队列优化线性DP)的更多相关文章

  1. 洛谷luogu3957跳房子(单调队列优化)

    QwQ被普及组的题折磨的死去活来. 硬是卡线段树,没卡过QwQ oi生涯,第一道正经的单调队列dp题 进入正题 题目大意: 其中\(n \le 500000\) 看到这个题的第一感觉就是二分金币数 很 ...

  2. poj1821 Fence【队列优化线性DP】

    Fence Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6122   Accepted: 1972 Description ...

  3. 洛谷p1725 露琪诺 单调队列优化的DP

    #include <iostream> #include <cstdio> #include <cstring> using namespace std; int ...

  4. 单调队列以及单调队列优化DP

    单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...

  5. bzoj1855: [Scoi2010]股票交易 单调队列优化dp ||HDU 3401

    这道题就是典型的单调队列优化dp了 很明显状态转移的方式有三种 1.前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.前i-W-1天买进一些股: dp[i][j ...

  6. 【bzoj3831】[Poi2014]Little Bird 单调队列优化dp

    原文地址:http://www.cnblogs.com/GXZlegend/p/6826475.html 题目描述 In the Byteotian Line Forest there are   t ...

  7. BestCoder Round #89 02单调队列优化dp

    1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01  HDU 5944   水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...

  8. [NOIP2017普及组]跳房子(二分,单调队列优化dp)

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

  9. P3957 跳房子(二分答案+单调队列优化DP)

    题目链接:https://www.luogu.org/contestnew/show/4468 题目大意:跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则 ...

随机推荐

  1. scala 数据结构(二):数组

    1 数组-定长数组(声明泛型) 第一种方式定义数组 这里的数组等同于Java中的数组,中括号的类型就是数组的类型 val arr1 = new Array[Int](10) //赋值,集合元素采用小括 ...

  2. 机器学习03 /jieba详解

    机器学习03 /jieba详解 目录 机器学习03 /jieba详解 1.引言 2.分词 2.1.jieba.cut && jieba.cut_for_search 2.2.jieba ...

  3. 前端01 /HTML简单简绍

    前端01 /HTML简单简绍 目录 前端01 /HTML简单简绍 1.web服务本质 2.浏览器的工作流程 3.HTML是什么 4.web服务本质 5.HTML文档结构 6.HTML注释 6.标签语法 ...

  4. C#/VB.NET 在Word中添加条码、二维码

    本文介绍如何通过C# 和VB.NET代码实现在Word文档中添加条码和二维码.代码中将分为在Word正文段落中.页眉页脚中等情况来添加. 使用工具:Free Spire.Office for .NET ...

  5. Ubuntu虚拟机设置共享文件夹

    Ubuntu虚拟机设置共享文件夹 注:个人笔记,小白笔记. 点击设置 进入到Ubuntu 中 cd /mnt/hgfs/ 后   我们会看到自己设置的共享文件夹.

  6. java实现判断时间是否为合法时间

    最近遇到一个需求,输入字符串,判断为日期的话再进行后面的比较大小之类的操作,但是合法日期的格式也是比较多的,利用正则表达式又太长了.所以后面利用的方法就是,先把输入的字符串转成一种固定的时间格式,然后 ...

  7. 手把手撸套框架-ORM框架的选择

    目录 一,为什么选择SqlSugar? 在.net core ORM框架中,能选择的方案其实有很多,包括以下方案: 1,EF-Core 2,Dapper 3,FreeSql 4,SqlSugar 为什 ...

  8. layui 魔改:上传时的真实进度条

    这个问题本身不复杂,难点在于需要改 layui 的源码. HTML略. 网页的JS域: layui.use(['upload','element','layer'], function(){ var ...

  9. uTools - 你的生产力工具集

    工具介绍 uTools是一个极简.插件化.跨平台的现代化桌面软件.通过自由选配丰富的插件,打造你得心应手的工具集合. 通过快捷键(默认alt+space)就可以快速呼出这个搜索框.它相当聪明,可以支持 ...

  10. 软件测试面试题,十年HR面试经验分享

    WeChat[代码小姐],快和我们一起进大厂,挑战高薪吧. 问:你在测试中发现了一个  bug ,但是开发经理认为这不是一个  bug ,你应该怎样解决. 1.将问题提交到缺陷管理库里面进行备案.2. ...