【题目】
【分析】
依旧没有想到正解。。。
用 f[i] 表示从 i 到 n 的最大功率
考虑怎么转移
对于 i,无非就两种情况,选或者不选,那就分以下两种情况:
- 若不选 i,直接是 f[i]=f[i+1],就是 i+1 到 n 的最大功率
- 若选 i,就找到它不会影响的第一个位置(设为 pos),那就是 f[i]=f[pos]+p[i]
在这两种情况下取个最大值就可以了
这样看来,倒着推的原因就很显然了,由于 a i a_i ai 是单调递增的,所以找 pos 的时候就可以二分了
时间复杂度:O ( n ∗ l o g    n ) (n*log\;n) (n∗logn)
【代码】
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 100005
using namespace std;
long long f[N];
int a[N],p[N],x[N];
int main()
{
// freopen("earth.in","r",stdin);
// freopen("earth.out","w",stdout);
int n,i,pos;
scanf("%d",&n);
for(i=1;i<=n;++i)
scanf("%d%d%d",&a[i],&p[i],&x[i]);
long long Max=0;
for(i=n;i;--i)
{
pos=upper_bound(a+1,a+n+1,a[i]+x[i])-a;
f[i]=max(f[i+1],f[pos]+p[i]);
Max=max(Max,f[i]);
}
printf("%lld",Max);
// fclose(stdin);
// fclose(stdout);
return 0;
}