比赛 NOIP2008集训模拟1 评测结果 AAAAAAAWWA
题目名称 地精贸易 最终得分 80
用户昵称 zqzas 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2008-11-10 10:17:45
显示代码纯文本
#include <iostream>
#include <stdlib.h>

#define MAXN 102
#define MAXV 100010

using namespace std;

int n,v,num[2],data[MAXN][2],c[2][MAXN],w[2][MAXN],buymany[2][MAXN],f[MAXN][MAXV];

void getMany(int st,int i,int j)
{
	if (i==0)
		return;
	if (f[i][j]==f[i-1][j])
	{
		getMany(st,i-1,j);
	}
	else
	{
		if (j-c[st][i]>=0)
		{
			buymany[st][i]++;
			getMany(st,i,j-c[st][i]);
		}
	}
}

void dp(int st)
{
	int i,j;
	for (i=1;i<=num[st];i++)
	{
		for (j=0;j<=v;j++)
		{
			f[i][j]=f[i-1][j];
			if (j-c[st][i]>=0)
			{
				if (f[i][j-c[st][i]]+w[st][i]>f[i][j])
					f[i][j]=f[i][j-c[st][i]]+w[st][i];
			}
		}
	}
	getMany(st,num[st],v);
}

void ini()
{
	int i,j,a,b,flag,ans=0;
	cin>>v>>n;
	for (i=1;i<=n;i++)
	{
		cin>>a>>b;
		data[i][0]=a;
		data[i][1]=b;
		flag=1;
		for (j=1;j<i;j++)
			if (data[i][0]==data[j][0] && data[i][1]==data[j][1])
			{
				flag=0;
				break;
			}
		if (flag==0)
			continue;
		if (a<b)
		{
			//st 0
			num[0]++;
			c[0][num[0]]=a;
			w[0][num[0]]=b-a;
		}
		if (a>b)
		{
			//st 1
			num[1]++;
			c[1][num[1]]=b;
			w[1][num[1]]=a-b;
		}
	}
	dp(0);
	ans=f[num[0]][v];
	v+=f[num[0]][v];
	memset(f,0,sizeof(f));
	dp(1);
	printf("%d\n",f[num[1]][v]+ans);
}

void print()
{
	int i,p=0,q=0;
	for (i=1;i<=n;i++)
	{
		if (data[i][0]<data[i][1])
		{
			p++;
			if (buymany[0][p]==0)
				cout<<"Buy 0";
			else
				cout<<"Buy "<<buymany[0][p]<<" from Alliance";
		}
		if (data[i][0]>data[i][1])
		{
			q++;
			if (buymany[1][q]==0)
				cout<<"Buy 0";
			else
				cout<<"Buy "<<buymany[1][q]<<" from Horde";
		}
		if (data[i][0]==data[i][1])
		{
			cout<<"Buy 0";
		}
		if (i!=n)
			cout<<endl;
	}
}

int main()
{
	freopen("goblin.in","r",stdin);
	freopen("goblin.out","w",stdout);
	ini();
	print();
	return 0;
}