AcWing 734. 能量石
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
const int N = 500007;
struct node{
int s, e, l;
bool operator<(const node &t)const {
return s * t.l < t.s * l;
}
}a[N];
int f[N];
int n, m, T;
int main(){
int cnt = 0;
scanf("%d", &T);
while(T -- ){
memset(f, 0xcf, sizeof f);
scanf("%d", &n);
m = 0;
for(int i = 1; i <= n; ++ i){
scanf("%d%d%d", &a[i].s, &a[i].e, &a[i].l);
m += a[i].s;
}
sort(a + 1, a + 1 + n);
f[0] = 0;
for(int i = 1; i <= n; ++ i)
for(int j = m; j >= a[i].s; -- j){
f[j] = max(f[j], f[j - a[i].s] + max(0, a[i].e - (j - a[i].s) * a[i].l));
}
int ans = 0;
for(int i = 1; i <= m; ++ i)
ans = max(ans, f[i]);
printf("Case #%d: %d\n", ++cnt, ans);
}
return 0;
}
例题:国王游戏,耍杂技的牛