记录编号 115008 评测结果 AAAAAAAAAA
题目名称 [USACO Jan09] 气象牛 最终得分 100
用户昵称 GravatarJSX 是否通过 通过
代码语言 C++ 运行时间 0.060 s
提交时间 2014-08-12 20:04:49 内存使用 0.34 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 110
using namespace std;
int N,E;
int M[MAXN]={0};
int f[MAXN][MAXN]={0};

inline int ABS(int x){
	if(x>=0)	return x;
	else	return -x;
}

int MIN(int x,int y){
	if(x<y) return x;
	return y;
}

int F1(int k){//如果i小于s1,误差是:2*|Mi–M(s1)|
	int Ans=0;
	for(int m=1;m<=k-1;++m)
	{
		Ans+=( 2*ABS(M[m]-M[k]) );
	}
	return Ans;
}

int F2(int i){//如果i大于sK,误差为: 2*|Mi–M(sK)| 
	int Ans=0;
	for(int m=i+1;m<=N;++m)
	{
		Ans+=( 2*ABS((M[m]-M[i])) );
	}
	return Ans;
}

int F3(int k,int i){ //如果i在sj和s(j+1)之间,误差是: |2*Mi–Sum(sj,s(j+1))| 
	int Ans=0;
	for(int m=k+1;m<=i-1;++m)
	{
		Ans+=ABS(2*M[m]-(M[k]+M[i]));
	}
	return Ans;
}

int main()
{
	freopen("baric.in","r",stdin);
	freopen("baric.out","w",stdout);
	
	scanf("%d%d",&N,&E);
	for(int i=1;i<=N;++i)	scanf("%d",&M[i]);
	
	for(int i=1;i<=N;++i)	f[i][1]=F2(i)+F1(i);
	
	for(int i=2;i<=N;++i)
	{
		for(int j=2;j<=i;++j)
		{
			int t=0x7fffffff;
			for(int k=j-1;k<=i;++k)
			{
				int temp=f[k][j-1]-F2(k)+F2(i)+F3(k,i);
				t=MIN(t,temp);
			}
			f[i][j]=t;
		}
	}

	bool flag=false;
	int t=0x7fffffff,z=0;
	for(int j=1;j<=N;++j)
	{
		for(int i=j;i<=N;++i)
		{
			if(f[i][j]<E){
				flag=true;
				z=j;
				if(flag){
					if(t>f[i][j])	t=f[i][j];
				}
			}
		}
		if(flag) {
			printf("%d %d",z,t);
			break;
		}		
	}
	
	return 0;
}