比赛 NOIP2017普及组模拟赛Mike 评测结果 AAAAAAAATT
题目名称 气象牛 最终得分 80
用户昵称 路人甲 运行时间 3.063 s
代码语言 C++ 内存使用 5.37 MiB
提交时间 2017-09-30 12:57:13
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int N=110;
int m[N],w[N][N],f[N][N],n,e;

int main() {
	freopen("baric.in","r",stdin);
	freopen("baric.out","w",stdout);
	memset(f,0x3f3f3f3f,sizeof f);
	memset(w,0,sizeof w);
	scanf("%d%d",&n,&e);
	for (int i=1; i<=n; ++i) scanf("%d",&m[i]);
	for (int i=0; i<=n; ++i) {
		for (int j=i+1; j<=n+1; ++j) {
			for (int k=i+1; k<j; ++k) {
				if (i==0) {
					w[i][j]+=2*abs(m[j]-m[k]);
					continue;
				}
				if (j==n+1) {
					w[i][j]+=2*abs(m[i]-m[k]);
					continue;
				}
				w[i][j]+=abs(2*m[k]-m[i]-m[j]);
			}
		}
	}
	f[0][1]=0;
	w[0][n+1]=1e9;
	for (int i=1; i<=n+1; ++i) {
		for (int j=1; j<=i+1; ++j) {
			for (int k=0; k<i; ++k) {
				if (j-1<=k+1){
					f[i][j]=min(f[i][j],f[k][j-1]+w[k][i]);
				}
			}
		}
	}
	for (int i=1;i<=n+2;++i){
		if (f[n+1][i]<=e){
			printf("%d %d\n",i-2,f[n+1][i]);
			return 0;
		}
	}
	return 0;
}