bzoj5441: [Ceoi2018]Cloud computing
跟着大佬做题。。
这题也是有够神仙了。观察一下性质,c很小而f是一个限制条件(然而我并不会心态爆炸)
%了一发,就是把电脑和订单一起做背包,订单的c视为负而电脑的v为负,f由大到小排序做背包
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; struct node{int c,f;LL v;}a[4100]; bool cmp(node n1,node n2){return n1.f==n2.f?n1.c>n2.c:n1.f>n2.f;} LL f[110000]; int main() { int n,m; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d%lld",&a[i].c,&a[i].f,&a[i].v); a[i].v=-a[i].v; } scanf("%d",&m); for(int i=n+1;i<=n+m;i++) { scanf("%d%d%lld",&a[i].c,&a[i].f,&a[i].v); a[i].c=-a[i].c; } n+=m; sort(a+1,a+n+1,cmp); int maxp=0;LL lin; memset(f,-63,sizeof(f));f[0]=0; lin=f[1]; for(int i=1;i<=n;i++) { if(a[i].c>0) { for(int j=maxp;j>=0;j--) if(f[j]!=lin) { f[j+a[i].c]=max(f[j+a[i].c],f[j]+a[i].v); if(j+a[i].c>maxp)maxp=j+a[i].c; } } else { for(int j=-a[i].c;j<=maxp;j++) if(f[j]!=lin) f[j+a[i].c]=max(f[j+a[i].c],f[j]+a[i].v); } } LL ans=0; for(int i=0;i<=maxp;i++)ans=max(ans,f[i]); printf("%lld\n",ans); return 0; }
pain and happy in the cruel world.