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;
}

  

posted @ 2018-10-22 14:43  ~Silent  阅读(271)  评论(0编辑  收藏  举报
Live2D