想到一半不想想优化了,看看能不能骗分
先看了看原来的代码:
#include<bits/stdc++.h>
#define fi first
#define se second
#define m_p make_pair
#define PII pair<int,int>
#define int long long
using namespace std;
const int MAXN=1e6+7;
const int INF=1e18+7;
inline int read(){
int x=0,w=1;
char ch=getchar();
for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*w;
}
int n,d,k,x[MAXN],s[MAXN],dp[MAXN];
bool ch(int j,int i,int g)
{
if (x[i]-x[j]>=d-g&&x[i]-x[j]<=d+g) return 1;
return 0;
}
bool check(int g)
{
memset(dp,-0x3f,sizeof(dp));
dp[0]=0;
for (int i=1;i<=n;i++)
{
for (int j=0;j<i;j++)
{
if (ch(j,i,g)) dp[i]=max(dp[i],dp[j]+s[i]);
}
if (dp[i]>=k) return 1;
}
return 0;
}
signed main()
{
cin>>n>>d>>k;
for (int i=1;i<=n;i++)
cin>>x[i]>>s[i];
int l=0,r=1e9+7,ans=0;
while(l<=r)
{
int mid=(l+r)>>1;
if (check(mid)) r=mid-1,ans=mid;
else l=mid+1;
}
cout<<ans;
return 0;
}
这个 j 是从 0 开始枚举的,有问题,改一改
就成了下面这个:
#include<bits/stdc++.h>
#define fi first
#define se second
#define m_p make_pair
#define PII pair<int,int>
#define int long long
using namespace std;
const int MAXN=1e6+7;
const int INF=1e18+7;
inline int read(){
int x=0,w=1;
char ch=getchar();
for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*w;
}
int n,d,k,x[MAXN],s[MAXN],dp[MAXN];
bool ch(int j,int i,int g)
{
if (x[i]-x[j]>=d-g&&x[i]-x[j]<=d+g) return 1;
return 0;
}
bool check(int g)
{
memset(dp,-0x3f,sizeof(dp));
dp[0]=0;
for (int i=1;i<=n;i++)
{
for (int j=max(0ll,i-30);j<i;j++)
{
if (ch(j,i,g)) dp[i]=max(dp[i],dp[j]+s[i]);
}
if (dp[i]>=k)
return 1;
}
return 0;
}
signed main()
{
cin>>n>>d>>k;
for (int i=1;i<=n;i++)
cin>>x[i]>>s[i];
int l=0,r=1e9+7,ans=0;
while(l<=r)
{
int mid=(l+r)>>1;
if (check(mid)) r=mid-1,ans=mid;
else l=mid+1;
}
cout<<ans;
return 0;
}
然后就过了(狂喜
建议加强数据(((