BZOJ 5441: [Ceoi2018]Cloud computing
背包
#include<cstdio> #include<algorithm> using namespace std; int n,m,Len; long long F[2][100005]; struct node{ int c,f,v; }E[100005]; bool cmp(node a,node b){ return a.f>b.f || (a.f==b.f && a.c>b.c); } int main(){ scanf("%d",&n); for (int i=1; i<=n; i++) scanf("%d%d%d",&E[i].c,&E[i].f,&E[i].v); for (int i=1; i<=n; i++) E[i].v=-E[i].v; scanf("%d",&m); for (int i=1; i<=m; i++) scanf("%d%d%d",&E[i+n].c,&E[i+n].f,&E[i+n].v); for (int i=1; i<=m; i++) E[i+n].c=-E[i+n].c; Len=n+m; sort(E+1,E+Len+1,cmp); int Max=0; for (int i=0; i<Len; i++){ int tomax=Max; if (E[i+1].c>0) tomax+=E[i+1].c; for (int j=0; j<=Max; j++) F[(i+1)%2][j]=F[i%2][j]; for (int j=Max+1; j<=tomax; j++) F[(i+1)%2][j]=-1ll<<60; for (int j=0; j<=Max; j++) if (j+E[i+1].c>=0) F[(i+1)%2][j+E[i+1].c]=max(F[(i+1)%2][j+E[i+1].c],F[i%2][j]+E[i+1].v); Max=tomax; } long long ans=0; for (int i=0; i<=Max; i++) ans=max(ans,F[Len%2][i]); printf("%lld\n",ans); return 0; }