[P3957][NOIP2017]跳房子 (DP+二分/队列?)

时间:2023-03-10 00:55:44
[P3957][NOIP2017]跳房子 (DP+二分/队列?)

看到GREED_VI大佬在打这题

我这个蒟蒻偷偷看一眼洛谷上目前普及难度里最难的一题

题目还是能看懂的,不想道路游戏那题,我完全不知道题目是什么意思……

GREED_VI大佬第一次用的是二分的思想,于是我就学习了

洛谷测评机快,因此可以过,不过想在CCF老年机上过,就需要优化了

先打了二分的

大致就是二分金币(g),然后判断分数能否大于等于k 就好,取最小的g值

(我一开始全局变量和局部变量搞错了)

#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[],s[],f[];
ll n,d,k,ans;
bool check(int g)
{
int maxl,maxr;
maxl=d-g;
maxr=d+g;
memset(f,-,sizeof(f));
f[]=;
for(int i=;i<=n;i++)
{
for(int j=i-;j>=;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 ;
}
}
return ;
}
int main()
{
cin>>n>>d>>k;
for(int i=;i<=n;i++){
cin>>x[i]>>s[i];
}
int l=,r=,mid;
while(l<=r)//g
{
mid=(l+r)/;
if(check(mid)){
ans=mid;
r=mid-;
}
else l=mid+;
}
cout<<ans;
}

正在研究队列的方法……

听说初赛前写博客RP++

那么希望NOIP2018 初赛 RP++!