比赛 10.10.18noip模拟 评测结果 WAWWWWWWWW
题目名称 罪犯问题B 最终得分 10
用户昵称 苏轼 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2010-10-18 21:55:21
显示代码纯文本
#include <cstdio>
#include <algorithm>
using namespace std;

const int MAXN=1005,MAXM=50005;

int w[MAXN],d[MAXM];
int a1[MAXN],a2[MAXN];
int N,M,K;

int main()
{
	freopen("criminalb.in","r",stdin);
	freopen("criminalb.out","w",stdout);
	scanf("%d%d%d",&N,&M,&K);
	for(int i=1;i<=N;i++)
		scanf("%d",w+i);
	for(int i=0;i<M;i++)
	{
		int X;
		scanf("%d",&X);
		if (X>0) a1[X]++;
		else a2[-X]++;
	}
	for(int i=1;i<=N;i++)
		for(int j=K;j>=0;j--)
		{
			if (!j>=a2[i]&&!j>=a1[i])
			{
				d[i]=0;
				continue;
			}
			if (j>=a2[i])
				d[j]=max(d[j],d[j-a2[i]]+w[i]);
			if (j>=a1[i])
				d[j]=max(d[j],d[j-a1[i]]);
		}
	printf("%d\n",d[K]);
	for(int i=1;i<=K;i++)
		d[i]=100000000;
	d[0]=0;
	for(int i=1;i<=N;i++)
	{
		for(int j=K;j>=0;j--)
		{
			if (a1[i]!=0) 
				d[j]=100000000;
			if (j>=a2[i])
				d[j]=min(d[j],d[j-a2[i]]+w[i]);
			if (j>=a1[i])
				d[j]=min(d[j],d[j-a1[i]]);
		}
	}
	printf("%d\n",d[K]);
	return 0;
}