悬关求助
查看原帖
悬关求助
850632
North_encounter楼主2023/8/21 18:21

90pts

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct student{
	ll s,x;
}m[1000001];
ll dp[1000001];
ll n,d,k;
inline bool check(ll g){
	ll minn=d-g;
	dp[0]=0;
	if(minn<=0){
		minn=1;
	}
	ll maxn=d+g;
	for(ll i=1;i<=n;i++){
		for(ll j=i-1;j>=0;j--){
			if(m[i].s-m[j].s<minn){
				continue;
			}
			if(m[i].s-m[j].s>maxn){
				break;
			}
			dp[i]=max(dp[i],dp[j]+m[i].x);
			if(dp[i]>=k) return 1;
		}
	}
	return 0;
}
signed main(){
	cin>>n>>d>>k;
	for(ll i=1;i<=n;i++){
		cin>>m[i].s>>m[i].x;
	}
	ll l=0,r=10000005,mid;
	long long ans=-1;
	while(l<=r){
		for(ll k=1;k<=n;k++){
			dp[k]=-2100000000;
		}
		mid=(l+r+1)/2;
		if(check(mid)){
			r=mid-1;
			ans=mid;
		}else{
			l=mid+1;
		}
	}
	cout<<ans;
	return 0;
}
2023/8/21 18:21
加载中...