蒟蒻求助大佬
查看原帖
蒟蒻求助大佬
422387
VIOLET__FOREVER楼主2022/7/3 11:25

T了,只有80分

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(!isdigit(c)){f=-1;c=getchar();};
	while(isdigit(c)){x=x*10+c-'0';c=getchar();};
	return x*f;
}
ll ans=1e9,n,d,k,maxx,mid;
ll dist[500005],num[500005],cnt[500005];
bool check(int x){
	int lw=d-x,rw=d+x;
	lw=max(1,lw);
	for(int i=0;i<=n;i++){
		cnt[i]=-1e9;
	}
	cnt[0]=0;
	for(int i=0;i<n;i++){
		for(int j=i+1;j<=n;j++){
			if(dist[j]-dist[i]>=lw && dist[j]-dist[i]<=rw){
				cnt[j]=max(cnt[j],cnt[i]+num[j]);
				if(cnt[j]>=k) return 1;
			}
			else{
				if(dist[j]-dist[i]>lw) break;
			}
		}
	}
	return 0;
}
int main(){
	n=read(),d=read(),k=read();
	for(int i=1;i<=n;i++){
		dist[i]=read(),num[i]=read();
		maxx=max(maxx,dist[i]);
	}
	dist[0]=0,num[0]=0;
	ll l=0,r=maxx-d;
	while(l<=r){
		mid=l+(r-l)/2;
//		cout<<mid<<endl;
		if(check(mid)){
			ans=min(ans,mid);
			r=mid-1;
		}
		else l=mid+1;
//		for(int i=1;i<=n;i++) cout<<cnt[i]<<" ";
//		cout<<endl;
	}
	if(ans==1e9) cout<<"-1";
	else cout<<ans;
	return 0;
}
2022/7/3 11:25
加载中...