[P3957][NOIP2017]跳房子 (DP+二分/队列?)
看到GREED_VI大佬在打这题
我这个蒟蒻偷偷看一眼洛谷上目前普及难度里最难的一题
题目还是能看懂的,不想道路游戏那题,我完全不知道题目是什么意思……
GREED_VI大佬第一次用的是二分的思想,于是我就学习了
洛谷测评机快,因此可以过,不过想在CCF老年机上过,就需要优化了
先打了二分的
大致就是二分金币(g),然后判断分数能否大于等于k 就好,取最小的g值
(我一开始全局变量和局部变量搞错了)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> #define max(a,b) (a>b?a:b) #define min(a,b) (a<b?a:b) #define ll long long using namespace std; ll x[500005],s[500005],f[500005]; ll n,d,k,ans; bool check(int g) { int maxl,maxr; maxl=d-g; maxr=d+g; memset(f,-127,sizeof(f)); f[0]=0; for(int i=1;i<=n;i++) { for(int j=i-1;j>=0;j--) { if(x[i]-x[j]<maxl) continue; if(x[i]-x[j]>maxr) break; f[i]=max(f[i],f[j]+s[i]); if(f[i]>=k) return 1; } } return 0; } int main() { cin>>n>>d>>k; for(int i=1;i<=n;i++){ cin>>x[i]>>s[i]; } int l=1,r=10000,mid; while(l<=r)//g { mid=(l+r)/2; if(check(mid)){ ans=mid; r=mid-1; } else l=mid+1; } cout<<ans; }
正在研究队列的方法……
听说初赛前写博客RP++