[luogu 3957]跳房子

时间:2021-08-17 11:58:59

题目链接

50分做法

挺显然的一个做法,因为金币量是单调的(如果你花i枚金币可以得到最优解,i+1枚也一定可以),所以可以二分答案

然后对于二分出来的每个答案,都做一遍dp,效率$O(n^2logn)$

#include <cstdio>
#include <cstring>
using namespace std;
#define N 500100
inline int read(){
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-f;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*f;
}
int n,d,k,a[N],s[N],dp[N];
int max(int x,int y){return x>y?x:y;}
bool check(int g){
memset(dp,,sizeof(dp));
int t1=(d-g)?d-g:,t2=d+g,mx=;
dp[]=;
for(int i=;i<=n;i++){
for(int j=;j<i;j++){
if(a[i]-a[j]>=t1&&a[i]-a[j]<=t2)
dp[i]=max(dp[i],dp[j]+s[i]);
}
}
for(int i=;i<=n;i++)mx=max(dp[i],mx);
if(mx>=k)return ;
return ;
}
int main(){
n=read();d=read();k=read();
for(int i=;i<=n;i++)
a[i]=read(),s[i]=read();
int ans=,l=,r=;
while(l<=r){
int mid=(l+r)>>;
if(check(mid))r=mid-,ans=mid;
else l=mid+;
}
if(ans)printf("%d\n",ans);
else puts("-1");
return ;
}

50分做法

100分做法

考虑怎么让效率降下来

50分的思路没问题,尝试一下能不能让每次dp的效率降下来

观察到答案其实也是单调的,dp[i]的答案是从前面i-d-g个数转移过来的,所以可以使用单调队列优化

总复杂度就变成$O(nlogn)$,能过100分的数据了

#include <cstdio>
#include <cstring>
#define ll long long
inline ll read(){
ll x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-f;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*f;
}
using namespace std;
#define inf (1<<30)
ll n,d,k,a[],s[];
ll dp[];
ll q[];
ll max(ll x,ll y){return x>y?x:y;}
bool check(ll g){
ll l=,r=,p=,t1=max(d-g,),t2=d+g;
q[]=;
for(int i=;i<=n;i++){
dp[i]=-inf;
while(a[i]-a[p]>=t1&&p<i){
while(l<=r&&dp[p]>=dp[q[r]])r--;
q[++r]=p++;
}
while(a[i]-a[q[l]]>t2&&l<=r)l++;
if(l>r||dp[q[l]]==-inf)continue;
dp[i]=dp[q[l]]+s[i];
if(dp[i]>=k)return ;
}
return ;
}
int main(){
n=read(),d=read(),k=read();
for(int i=;i<=n;i++)
a[i]=read(),s[i]=read();
a[]=,s[]=;
ll l=,r=,ans=-;
while(l<=r){
ll mid=(l+r)>>;
if(check(mid))ans=mid,r=mid-;
else l=mid+;
}
printf("%lld\n",ans);
return ;
}

100分做法

[luogu 3957]跳房子的更多相关文章

  1. Luogu 3957 &lbrack;NOIP2017&rsqb;普及组 跳房子

    写了好久,感觉自己好菜,唉…… 首先发现这个$g$的取值具有单调性,可以想到二分答案,然后考虑用$dp$来检验,这样子可以写出朴素的转移方程: 设$f_i$表示以$i$结尾的最大价值,那么有$f_i ...

  2. Luogu P3957 跳房子

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

  3. Luogu P3120 &lbrack;USACO15FEB&rsqb;牛跳房子(金)Cow Hopscotch &lpar;Gold&rpar;

    题目传送门 这是一道典型的记忆化搜索题. f[x][y]表示以x,y为右下角的方案数. code: #include <cstdio> #define mod 1000000007 usi ...

  4. luogu P3657 &lpar;NOIP2017&rpar; 跳房子(二分&plus;DP&plus;单调队列)

    题面 传送门 分析 显然答案有单调性,可以二分答案,设当前二分值为g,根据题意我们可以求出跳跃长度的范围[l,r] 考虑DP 子状态: dp[i]表示跳到第i个点时的最大和 状态转移方程 \(dp[i ...

  5. P3957 跳房子(二分答案&plus;单调队列优化DP)

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

  6. 洛谷【P5004 专心OI - 跳房子】 题解

    题目链接 https://www.luogu.org/problem/P5004 洛谷 P5004 专心OI - 跳房子 Imakf有一天参加了PINO 2017 PJ组,他突然看见最后一道题 他十分 ...

  7. Luogu 魔法学院杯-第二弹(萌新的第一法blog)

    虽然有点久远  还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题  沉迷游戏,伤感情 #include <queue> ...

  8. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

  9. &lbrack;luogu P2170&rsqb; 选学霸(并查集&plus;dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...

随机推荐

  1. Codeforces Round &num;383 &lpar;Div&period; 1&rpar;

    A: 题目大意:给出一个有向图(n<=100),每个点的出度都为1,求最小的t,使得任意两点x,y,如果x走t步后能到y,那么y走t步后到x. 题解: 首先每个点应该都在一个环上,否则无解. 对 ...

  2. 通过原生JS实现为元素添加事件

    自己写了一个为元素添加事件的方法,并封装到对象中. 说明: id : 目标元素的ID type: 事件的类型,注意的是不能加on fn:事件处理程序 isBubble :规定事件流 代码: var b ...

  3. IOS开发支付宝集成思路

    一般情况下支付功能的交互流程 比如我们去某个APP去支付一个产品,流程为:1.用户点击支付->2.客户端请求服务器用户支付->3.服务器接收请求生成金额订单等要给第三方支付的一切信息,并生 ...

  4. Git相关的项目

    1.posh-git Git的PowerShell扩展 项目地址: https://github.com/dahlbyk/posh-git 可以用psget快速安装扩展模块,psget下载安装地址 h ...

  5. iTunes Connect TERMS OF SERVICE

    iTunes Connect TERMS OF SERVICE THESE TERMS OF SERVICE CONSTITUTE A LEGAL AGREEMENT BETWEEN YOU AND ...

  6. Codeforces Round &num;335 &lpar;Div&period; 2&rpar; A&period; Magic Spheres 水题

    A. Magic Spheres Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.codeforces.com/contest/606/ ...

  7. &sol;etc&sol;resolv&period;conf文件详解

    大家好,今天51开源给大家介绍一个在配置文件,那就是/etc/resolv.conf.很多网友对此文件的用处不太了解.其实并不复杂,它是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名 ...

  8. jquery on绑定事件

    描述:给一个或多个元素(当前的或未来的)的一个或多个事件绑定一个事件处理函数.(1.7版本开始支持,是 bind().live() 和 delegate() 方法的新的替代品) 语法:.on( eve ...

  9. 剑指offer——python【第54题】字符流中第一个不重复的字符

    题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...

  10. BZOJ2821 作诗(分块)

    和区间众数几乎一模一样的套路. // luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include&l ...