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