记录编号 20280 评测结果 AAAAAAAAAA
题目名称 罪犯问题B 最终得分 100
用户昵称 GravatarPom 是否通过 通过
代码语言 C++ 运行时间 1.295 s
提交时间 2010-10-22 16:53:23 内存使用 0.66 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>

using namespace std;

const int MAXN=1010;
const int MAXM=50050;

int n,m,k,i,j,c[MAXN],a[MAXN],b[MAXN],f[2][MAXM],ans1,ans2;

int main()
{
	freopen("criminalb.in","r",stdin);
	freopen("criminalb.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);
	for (i=1;i<=n;i++)
		scanf("%d",&c[i]);
	for (i=1;i<=m;i++)
	{
		scanf("%d",&j);
		if (j>0) a[j]++;
		else b[-j]++;
	}
	for (j=0;j<=k;j++)
		f[0][j]=f[1][j]=-2000000000;
	f[0][0]=0;
	for (i=1;i<=n;i++)
		for (j=0;j<=k;j++)
		{
			f[i%2][j]=-2000000000;
			if (b[i]<=j) f[i%2][j]=f[(i+1)%2][j-b[i]]+c[i];
			if (a[i]<=j) f[i%2][j]=max(f[i%2][j],f[(i+1)%2][j-a[i]]);
		}
	ans1=-2000000000;
	for (i=0;i<=k;i++)
		if (f[n%2][i]>ans1) ans1=f[n%2][i];
	printf("%d\n",ans1);
	for (j=0;j<=k;j++)
		f[0][j]=f[1][j]=2000000000;
	f[0][0]=0;
	for (i=1;i<=n;i++)
		for (j=0;j<=k;j++)
		{
			f[i%2][j]=2000000000;
			if (b[i]<=j) f[i%2][j]=f[(i+1)%2][j-b[i]]+c[i];
			if (a[i]<=j) f[i%2][j]=min(f[i%2][j],f[(i+1)%2][j-a[i]]);
		}

	ans2=2000000000;
	for (i=0;i<=k;i++)
		if (f[n%2][i]<ans2) ans2=f[n%2][i];
	printf("%d\n",ans2);
	return 0;
}