比赛 20110414pm 评测结果 AWWAAAWAAA
题目名称 气象牛 最终得分 70
用户昵称 苏轼 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-04-14 15:06:22
显示代码纯文本
#include <cstdio>
#include <cstdlib>

const int MAXN=105;
const int oo=~0u>>2;

int w[MAXN][MAXN];
int d[MAXN][MAXN];
int N,E;
int M[MAXN];

int main()
{
	freopen("baric.in","r",stdin);
	freopen("baric.out","w",stdout);
	scanf("%d%d",&N,&E);
	for(int i=0;i<N;i++)
		scanf("%d",M+i);
	for(int i=0;i<N;i++)
		for(int j=0;j<N;j++)
			d[i][j]=w[i][j]=oo;	
	for(int i=0;i<N;i++)
		for(int j=i+1;j<N;j++)
		{
			w[i][j]=0;
			for(int k=i+1;k<j;k++)
				w[i][j]+=abs(2*M[k]-M[i]-M[j]);
		}
	for(int i=0;i<N;i++)
	{
		d[i][1]=0;
		for(int k=0;k<i;k++)
			d[i][1]+=2*abs(M[k]-M[i]);
	}
	for(int j=2;j<=N;j++)
		for(int i=j-1;i<N;i++)
		{
			for(int k=j-1-1;k<i;k++)
				if (d[i][j]>d[k][j-1]+w[k][i])
					d[i][j]=d[k][j-1]+w[k][i];
		}
	//calcu f[1]
	for(int i=0;i<N;i++)
	{
		int nd=0;
		for(int j=0;j<i;j++)
			nd+=2*abs(M[i]-M[j]);
		for(int j=i+1;j<N;j++)
			nd+=2*abs(M[i]-M[j]);
		if (nd<=E)
		{
			printf("1 %d\n",nd);
			return 0;
		}
	}
	for(int i=2;i<=N;i++)
		for(int j=i-1;j<N;j++)
		{
			int nd=d[j][i];
			for(int k=j+1;k<N;k++)
				nd+=2*abs(M[k]-M[j]);
			if (nd<=E)
			{
				printf("%d %d\n",i,nd);
				return 0;
			}
		}
	return 0;
}