比赛 20101117 评测结果 WWWWWWWWWW
题目名称 物品 最终得分 0
用户昵称 Pom 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2010-11-17 10:49:12
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>

using namespace std;

const int MAXN=1020;
const int oo=1000000000;

int f[MAXN][MAXN],n,i,j,k,p,a[MAXN][2],w,t;
char st[MAXN];
bool flag,b[MAXN],ke[MAXN][MAXN];

void init()
{
	freopen("magica.in","r",stdin);
	freopen("magica.out","w",stdout);
	scanf("%d%d\n",&n,&p);
	for (i=1;i<=n;i++)
	{
		flag=false;
		cin.getline(st,2000);
		for (j=0;j<strlen(st);j++)
			if (st[j]==' ') 
			{
				flag=true;
				w=j;
			}
		if (flag)
		{
			t=1;
			for (j=1;j<=w;j++)
			{
				a[i][0]+=((int) st[w-j]-48)*t;
				t*=10;
			}
			t=1;
			for (j=strlen(st)-1;j>w;j--)
			{
				a[i][1]+=((int) st[j]-48)*t;
				t*=10;
			}
		}
		else
		{
			w=strlen(st);
			t=1;
			for (j=1;j<=w;j++)
			{
				a[i][0]+=((int) st[w-j]-48)*t;
				t*=10;
			}
		}
		b[i]=flag;
	}
}

void solve()
{
	for (i=0;i<MAXN;i++)
		for (j=0;j<MAXN;j++)
			f[i][j]=-oo;
	memset(ke,false,sizeof(ke));
	ke[0][0]=true;
	f[0][0]=0;
	for (i=1;i<=n;i++)
		for (j=0;j<=n;j++)
			if (!b[i] || a[i][1]-a[i][0]<=p)
			{
				if (ke[i-1][j]) f[i][j]=f[i-1][j]+a[i][0];
				if (j>0 && ke[i-1][j-1] && f[i-1][j-1]+a[i][0]-p>=0)
					if (f[i-1][j-1]+a[i][0]-p>f[i][j]) f[i][j]=f[i-1][j-1]+a[i][0]-p;
				if (f[i][j]>=0) ke[i][j]=true;
			}
			else
			{
				if (ke[i-1][j]) f[i][j]=f[i-1][j]+a[i][0];
				if (j>0 && ke[i-1][j-1] && f[i-1][j-1]+a[i][0]-p>=0)
					if (f[i-1][j-1]+a[i][0]-p>f[i][j]) f[i][j]=f[i-1][j-1]+a[i][0]-p;
				if (ke[i-1][j+1]) 
					if (f[i-1][j+1]+a[i][1]>f[i][j]) f[i][j]=a[i][1]+f[i-1][j+1];
				if (ke[i-1][j])
					if (f[i-1][j]>=p)
						if (f[i-1][j]-p+a[i][1]>f[i][j]) f[i][j]=f[i-1][j]-p+a[i][1];
				if (f[i][j]>=0) ke[i][j]=true;
			}
	printf("%d\n",f[n][0]);
}

int main()
{
	init();
	solve();
	return 0;
}