题解 P3957 【跳房子】
对于这题有一个不用单调队列并且不是玄学设置区间最大值的做法
这题校内模拟考的时候打二分+枚举,结果写炸了,跑过来看题解发现为什么他们的区间最大值都是 $ 1005 $ ???特别懵,其实我的代码在dp方面并没有改善仍然是 $ O(n^2) $ 但在对区间最大值依照题意进行缩小从而可以 $ AC $。
首先我们能不去走负数的格子就尽量不去走负数的格子,这样就可以保证得分最高,但也会导致改造费用升高或不升(但最大值一定在此)那么我们考虑如何去只走正数格子,我们看到当 $ g >= d $ 的时候每次最多跳 $ g+d $ 格那么如果我们保证 $ g=max(d,max( $ 相邻两个正数格子间的距离 $ )) $ 那么我们就可以保证一定能走到所有正数格子,那么我们就可以以此缩小二分的区间从而缩小时间复杂度啦!

第一个是 $ r=1005 $ 另外一个就是按照前面的方法计算的,要快一点点qwq
对于 $ dp $ 楼下的大佬讲得挺详细的,我这个蒟蒻就不详细阐述了吧
代码君
#include<bits/stdc++.h>
using namespace std;
const int size=500005;
struct node{
long long data;
long long dis;
}a[size];
long long dp[size],di;
int n,d,k;
bool cheak(int g){
memset(dp,-127,sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;++i){
for(int j=i-1;j>=0;--j){
if(a[i].dis-a[j].dis<max(1,d-g)) continue;
if(a[i].dis-a[j].dis>d+g) break;
dp[i]=max(dp[i],dp[j]+a[i].data);
if(dp[i]>=k) return true;
}
}
return false;
}
int main(){
scanf("%d %d %d",&n,&d,&k);
int tmp=0;
for(int i=1;i<=n;++i){
scanf("%lld %lld",&a[i].dis,&a[i].data);
if(a[i].data>0) di=max(di,a[i].dis-a[tmp].dis),tmp=i;
}
int l=0,r=max(di,(long long)d),ans=1<<30;
while(l<=r){
int mid=(l+r)>>1;
if(cheak(mid)){
r=mid-1;
ans=min(mid,ans);
}else l=mid+1;
}if(ans==1<<30) ans=-1;
printf("%d",ans);
return 0;
}
题解 P3957 【跳房子】的更多相关文章
- 洛谷P3957 跳房子 题解 二分答案/DP/RMQ
题目链接:https://www.luogu.org/problem/P3957 这道题目我用到了如下算法: 线段树求区间最大值: 二分答案: DP求每一次枚举答案g时是否能够找到 \(\ge k\) ...
- Luogu P3957 跳房子
题面 跳房子,也叫跳飞机,是一种世界性儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 n 个格子,这些格子都在同一条直线上.每个格子内有一 ...
- P3957 跳房子
题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 n 个格子,这些格子都在同一条直线上.每个格子内 ...
- P3957 跳房子(二分答案+单调队列优化DP)
题目链接:https://www.luogu.org/contestnew/show/4468 题目大意:跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则 ...
- 洛谷 P3957 跳房子
https://www.luogu.org/problemnew/show/P3957 错误记录:1.没开longlong 2. -inf不够小 #include<cstdio> #inc ...
- 洛谷 P3957 跳房子 —— 二分答案+单调队列优化DP
题目:https://www.luogu.org/problemnew/show/P3957 先二分一个 g,然后判断: 由于转移的范围是一个区间,也就是滑动窗口,所以单调队列优化: 可以先令队尾为 ...
- 【题解】跳房子-C++
Description奶牛按不太传统的方式玩起小朋友玩的跳房子游戏,现给出一个5*%的由数字组成的网格.它们在格子中向前前跳,向后跳,向左跳,向右跳,跳到网格中另一个数字后,又这样继续跳(可能跳到某个 ...
- 洛谷P3957 跳房子(Noip2017普及组 T4)
今天我们的考试就考到了这道题,在考场上就压根没有思路,我知道它是一道dp的题,但因为太弱还是写不出来. 下来评讲的时候知道了一些思路,是dp加上二分查找的方式,还能够用单调队列优化. 但看了网上的许多 ...
- 洛谷P3957 跳房子
普及组的题.....填坑来了. 当年的我一眼二分+DP,现在都佩服起自己来了...... 然后我们就写个二分,在check里面写单调队列优化DP即可. 然后就A了...... #include < ...
随机推荐
- 21-ESP8266 SDK开发基础入门篇--C# TCP客户端 , 控制LED亮灭
https://www.cnblogs.com/yangfengwu/p/11192603.html 由于是台式机,,没有插无线网卡...所以呢我就用调试助手监控下数据 后期让WIFI连接路由器的时候 ...
- 搭建的一套vue打包方案,方便记录一下
package.json 配置如下: { "name": "rise-vue", "version": "1.0.0", ...
- bash循环得到日期目录
#!/bin/bash today=$(date "+%Y%m%d") echo 'today is :'${today} single_input="raw_data/ ...
- LG4074【WC2013】糖果公园 【树上莫队,带修莫队】
题目描述:给出一棵 \(n\) 个点的树,点有颜色 \(C_i\),长度为 \(m\) 的数组 \(V\) 和长度为 \(n\) 的数组 \(W\).有两种操作: 将 \(C_x\) 修改为 \(y\ ...
- 洛谷P1854 花店橱窗布置
题目 DP,直接递推比记忆化搜索简单. 定义状态\(dp[i][j]\)为前i行最后一个选择第i行第j个数所得到最大值. 易得状态转移方程 \(dp[i][j]=max(dp[i-1][k]+a[i] ...
- kafka-python 1.4.6 版本触发的一个 rebalance 问题
在使用了最新版的 kafka-python 1.4.6 在 broker 对 topic 进行默认配置的情况下报出类似错误 CommitFailedError CommitFailedError: C ...
- 18年今日头条笔试第一题题解:球迷(fans)
其实本题是加强版,原数据是100*100的,老师为了尊重我们的智商加成了3000*3000并进行了字符串处理…… 上原题~ 球迷 [问题描述] 一个球场C的球迷看台可容纳M*N个球迷.官方想统计一共有 ...
- Django基础之redirect()
参数可以是: 一个模型: 将调用模型的get_absolute_url()函数 一个视图, 可以带有函数: 可以使用urlresolvers.reverse来反向解析名称 一个绝对的或相对的URL, ...
- 思科ACL阻止勒索病毒
如何在思科的3700系列交换机上配置ACL阻止勒索病毒的传播? 勒索病毒主要是微软的锅,通过TCP/UDP的135.137.138.139.445端口攻陷用户的计算机加密用户的文件达到勒索比特币的目的 ...
- 移动端 - adb shell常见问题汇总
一.如何执行adb命令? 答:如果没有配置SDK的环境变量的话,那就先用cd命令进入adb所在文件目录(即F:\android-sdk-windows\platform-tools)后,再执行adb命 ...