1个关注能换1个50分求助吗?WA3 TLE2
查看原帖
1个关注能换1个50分求助吗?WA3 TLE2
393811
大海中的孤帆楼主2023/8/1 19:03
#include<bits/stdc++.h>
using namespace std;
int n,d,k;
int s[500010],f[500010];
int w[500010];
long long ll,rr;
int q(int a,int b)
{
	if(a>b)
		return a;
	return b;
}
int fuck(int money)
{
	ll=d-money;
	rr=d+money;//当前金币下可跳的距离范围
	if(ll<=0)
		ll=1;//防止负数距离
	for(int i=0;i<=n;++i)
	{
		w[i]=-1e6;//初始化
	}
	w[0]=0;//自己到第零个格子,也就是原点的得分为0
	for(int i=1;i<=n;++i)
	{
		for(int j=i-1;j>=0;--j)
		{
			if(s[i]-s[j]<ll)//距离下个格子比最小可跳跃距离小,无法选中
				continue;
			if(s[i]-s[j]>rr)//距离下个格子的距离大于能跳跃的最大距离
				break;
			w[i]=q(w[i],w[j]+f[i]);//背包dp,比较当前状态和新状态的大小
			if(w[i]>=k)
				return 1;
		}
	}
	return 0;
}
int main()
{
	cin>>n>>d>>k;
	for(int i=1;i<=n;++i)
		cin>>s[i]>>f[i];
	int l=0,r=s[n],z=-1;
	while(l<=r)
	{
		int mid=(l+r)/2;
		if(fuck(mid))
		{
			z=mid;
			r=mid-1;
		}
		else
		{
			l=mid+1;
		}
	}
	cout<<z;
	return 0;
}
2023/8/1 19:03
加载中...