求助,跳房子90分,最后一个点WA了

P3957 [NOIP2017 普及组] 跳房子

太久了,稍有遗忘 ``` #include<iostream> #include<cstdio> #include<cstring> using namespace std; long long f[500005],a[500005][2],n,d,k,ok,lpos,rpos; bool check(int g) { lpos = d-g;//跳的最短距离 rpos = d+g;//跳的最长距离 if(lpos<=0) lpos = 1; memset(f,-127,sizeof(f));//设为很小的负数 f[0]=0; for(int i=1; i<=n; i++) //普通的动规 { for(int j=i-1; j>=0; j--) { if(a[i][0]-a[j][0]<lpos) continue; if(a[i][0]-a[j][0]>rpos) break; f[i]=max(f[i],f[j]+a[i][1]); if(f[i]>=k) return 1; } } return 0; } int main() { int i,ans=-1,l,r,m; scanf("%lld%lld%lld",&n,&d,&k); for(i=1; i<=n; i++) scanf("%lld%lld",&a[i][0],&a[i][1]); l=0, r=1005; m=(l+r)/2; while(l<=r) // 二分答案 { if(check(m)) { ans=m; r=m-1; } else { l=m+1; } m=(l+r)/2; } cout<<ans; return 0; } ```
by 治涨的馒头 @ 2019-03-27 18:40:29


我只是个蒟蒻
by 治涨的馒头 @ 2019-03-27 18:40:46


@[gjm2005](/space/show?uid=93382) 记住这道题,顺便%一下djq ```cpp #include <bits/stdc++.h> #define rep(i,a,b) for(register int i=(a);i<(b);i++) #define per(i,a,b) for(register int i=(b);i>=(a);i--) #define For(i,a,b) for(register int i=(a);i<=(b);i++) #define Forenska(it,c) for(register __typeof(c.begin()) it=c.begin();it!=c.end();it++) #define pb push_back #define mp make_pair #define fi first #define se second #define all(x) x.begin(),x.end() #define sqr(x) ((x)*(x)) #define lowbit(x) ((x)&(-x)) using namespace std; typedef long long LL; typedef pair<int,int> Pair; typedef vector<int> vec; const long double PI=3.14159265358979323846264338327950288; const LL INFLL=0x3f3f3f3f3f3f3f3f; const int INF=0x3f3f3f3f; int read() { int x=0; char ch=' '; bool flag=false; while(!isdigit(ch)) { if(ch=='-')flag=true; ch=getchar(); } while(isdigit(ch)) { x=(x<<3)+(x<<1)+ch-'0'; ch=getchar(); } return flag?-x:x; } int n,d,k; const int MAX_N=500005; int x[MAX_N],s[MAX_N]; LL dp[MAX_N]; bool check(int g) { For(i,1,n)dp[i]=-INF; int L=max(1,d-g),R=d+g,j=0; deque <int> q; For(i,1,n) { while(x[i]-x[j]>=L && j<i) { while(!q.empty() && dp[q.back()]<dp[j])q.pop_back(); if(dp[j]>-INF)q.push_back(j); j++; } while(!q.empty() && x[i]-x[q.front()]>R)q.pop_front(); if(!q.empty())dp[i]=dp[q.front()]+s[i]; } For(i,1,n)if(dp[i]>=k)return true; return false; } int main() { n=read(),d=read(),k=read(); For(i,1,n)x[i]=read(),s[i]=read(); int lb=0,ub=INF; while(lb<ub) { int mid=(lb+ub)/2; if(check(mid))ub=mid; else lb=mid+1; } cout<<lb<<endl; return 0; } ```
by Smile_Cindy @ 2019-03-27 18:44:35


谢谢啦,已经对了
by _gjm2005_ @ 2019-03-27 20:54:09


@[gjm2005](/space/show?uid=93382) 怎么改的?help
by sunxiaofan @ 2019-09-14 17:25:58


|