前言:把鸽了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. html2canvas截图问题,图片跨域导致截图空白

    年前的一个项目,要做一个H5截屏分享的功能,使用的是html2canvas插件,截图功能是实现了,但是跨域的图片死活不出来, 经过几天谷歌百度和不断的尝试,终于找到解决办法了,一共经历了让人心力憔悴的 ...

  2. [SpringBoot]SpringBoot中使用redis事务

    本文基于SpringBoot 2.X 事务在关系型数据库的开发中经常用到,其实非关系型数据库,比如redis也有对事务的支持,本文主要探讨在SpringBoot中如何使用redis事务. 事务的相关介 ...

  3. 师兄大厂面试遇到这条 SQL 数据分析题,差点含泪而归!

    写在前面:我是「云祁」,一枚热爱技术.会写诗的大数据开发猿.昵称来源于王安石诗中一句 [ 云之祁祁,或雨于渊 ] ,甚是喜欢. 写博客一方面是对自己学习的一点点总结及记录,另一方面则是希望能够帮助更多 ...

  4. session + cookie 实现登录功能

    前端部分代码实现 <div id="mainCp"> <div class="postForm"> <p> <labe ...

  5. Tomcat更改错误页面指向,改变404,500错误页面

    在公司工作了一段时间,也被安排做了一个App,而且后台也是我来写和布置的,由于一次安全检查,需要我把tomcat默认页(管理页面)关闭,于是我只能进行默认指向变更,但是后面我又想到要是用户输入不存在的 ...

  6. 安装archlinux

    arch安装步骤 archlinux官方安装wiki 1.分区and格式化分区      (分区用fdisk,格式化分区用mkfs) 2.挂载分区  (mount命令) 3.安装archlinux   ...

  7. python numpy indexerror: too many indices for array

    import numpy as np #data 原来数组 #arr_1 新数组 #将data的第一列赋值给arr_1的第一列 arr_1 = np.array((data.shape[0],5)) ...

  8. com.aliyun.openservices.shade.com.alibaba.fastjson.JSONException: exepct '[', but {, pos 1, line 1, column 2

    报错原因:你放的是一个非List的对象 却想取一个List对象出来 package test; import java.text.SimpleDateFormat; import java.util. ...

  9. DEX文件解析--3、dex文件字符串解析

    一.前言    前两篇文章链接:     1.DEX文件头解析     2.DEX文件校验和解析    PS:前几天检查文件夹的时候发现DEX文件解析还只写了开头,正好找点事情来做,就去接着解析DEX ...

  10. xss小游戏源码分析

    配置 下载地址:https://files.cnblogs.com/files/Lmg66/xssgame-master.zip 使用:下载解压,放到www目录下(phpstudy),http服务下都 ...