BZOJ 5441 [Ceoi2018]Cloud computing
阿新 • • 發佈:2018-12-09
題目連結
題解
按照頻率排序後轉化成揹包問題。
程式碼
#include <cstdio>
#include <cstring>
#include <algorithm>
int read()
{
int x=0,f=1;
char ch=getchar();
while((ch<'0')||(ch>'9'))
{
if(ch=='-')
{
f=-f;
}
ch=getchar();
}
while((ch>='0' )&&(ch<='9'))
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
const int maxn=2000;
const int maxm=50;
struct query
{
int c,f,v;
bool operator <(const query &other) const
{
if(f==other.f)
{
return v<other.v;
}
return f>other.f;
}
};
long long f[maxn*maxm+10],ans;
int n,m,tot;
query q[maxn*2+10];
int main()
{
n=read();
for(int i=1; i<=n; ++i)
{
q[i].c=read();
q[i].f=read();
q[i].v=-read();
}
m=read();
for(int i=1; i<=m; ++i)
{
q[n+i].c=-read();
q[n+i].f=read();
q[n+i].v=read();
}
std ::sort(q+1,q+n+m+1);
memset(f,-63,sizeof f);
f[0]=0;
for(int i=1; i<=n+m; ++i)
{
if(q[i].c>0)
{
for(int j=tot; j>=0; --j)
{
f[j+q[i].c]=std::max(f[j+q[i].c],f[j]+q[i].v);
}
tot+=q[i].c;
}
else
{
for(int j=0; j-q[i].c<=tot; ++j)
{
f[j]=std::max(f[j],f[j-q[i].c]+q[i].v);
}
}
}
for(int i=0; i<=tot; ++i)
{
ans=std::max(ans,f[i]);
}
printf("%lld\n",ans);
return 0;
}