题目链接:HDU - 6495
显然只能dp做,而且dp的状态也很好找的。
dp[i][j]为前 i 个选 j 个剩下的最大血量。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e3+10;
int n,m,a[N],b[N],c[N],dp[N][N],res;
void solve(){
cin>>n>>m; memset(dp,0xcf,sizeof dp); dp[0][0]=m; res=0;
for(int i=1;i<=n;i++) cin>>a[i]>>b[i]>>c[i];
for(int i=1;i<=n;i++){
for(int j=0;j<=n;j++){
dp[i][j]=dp[i-1][j]+c[i];
if(j&&min(dp[i-1][j-1],b[i])>a[i])
dp[i][j]=max(dp[i][j],min(dp[i-1][j-1],b[i])+c[i]-a[i]);
if(dp[i][j]>0) res=max(res,j);
}
}
cout<<res<<'\n';
}
signed main(){
int T; cin>>T; while(T--) solve();
return 0;
}