题目大意
给你n次考试,m个人,你可以控制自己在第i次考试的名次为\([l[i],r[i]]\)
若第i-1次考试排名x,第i次考试排名为y
若y<=x/2 则可以获得num[i]的值
求你通过控制自己的名次最终可以获得的值
题目思路
设dp[i]为经历1-i次考试后的最大值
表述好难啊......
感觉看代码可以理解
复杂度为\(O(n*62)\)
代码
#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=1e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const int eps=1e-6;
ll n,m,ans;
ll l[maxn],r[maxn],num[maxn];
ll dp[maxn];
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>l[i]>>r[i]>>num[i];
}
for(int i=1;i<=n;i++){
ll cur=l[i],sum=0;
dp[i]=dp[i-1];
for(int j=i-1;j>=1;j--){
cur*=2;
if(cur>r[j]) break;
cur=max(cur,l[j]);
sum+=num[j+1];
dp[i]=max(dp[i],dp[j-1]+sum);
}
}
cout<<dp[n]<<endl;
return 0;
}