90pts,最后一个点
查看原帖
90pts,最后一个点
670998
Neven楼主2023/7/20 15:07
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int n, d, k, lft, rgt, mid, ans, f[N], mindis, maxdis;
struct node{
	int x, s;
}a[N];
bool check(int g){
	mindis = max(1, d - g);
	maxdis = 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(a[i].x - a[j].x < mindis) continue;
			if(a[i].x - a[j].x > maxdis) break;
			f[i] = max(f[i], f[j] + a[i].s);
			if(f[i] >= k) return 1;
		}
	}
	return 0;
}
int main(){
	cin >> n >> d >> k;
	for(int i = 1; i <= n; i++){
		cin >> a[i].x >> a[i].s;
	}
	rgt = min(a[n].x, 1005);
	while(lft <= rgt){
		mid = (lft + rgt) / 2;
		if(check(mid)){
			ans = mid;
			rgt = mid - 1;
		}else{
			lft = mid + 1;
		}
	}
	cout << ans << endl;
	return 0;
}
2023/7/20 15:07
加载中...