题目大意
给出很多道题,每题的得分随时间线性减少,求给定时间内最高得分
解题思路
考虑相邻两题的先后顺序,得到偏序关系,再经转化得到任意两题的绝对偏序关系,排序后就是背包问题。
code
using namespace std;
int const maxn=1000,maxt=3000;
int T,n,t,f[maxt+10];
struct rec{
int a,b,c;
};
rec a[maxn+10];
bool cmp(rec x,rec y){
return 1ll*x.c*y.b<1ll*y.c*x.b;
}
int main(){
freopen("score.in","r",stdin);
freopen("score.out","w",stdout);
scanf("%d",&T);
fo(cas,1,T){
scanf("%d%d",&n,&t);
fo(i,1,n)scanf("%d%d%d",&a[i].a,&a[i].b,&a[i].c);
sort(a+1,a+n+1,cmp);
fo(j,0,t)f[j]=0;
fo(i,1,n)
fd(j,t,a[i].c)
f[j]=max(f[j],f[j-a[i].c]+a[i].a-a[i].b*j);
int ans=0;
fo(j,0,t)ans=max(ans,f[j]);
printf("%d\n",ans);
}
return 0;
}