比赛 NOIP2008集训模拟3 评测结果 AWWWTTTTTA
题目名称 工作分配 最终得分 20
用户昵称 BYVoid 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2008-11-12 09:35:51
显示代码纯文本
#include <iostream>

using namespace std;

typedef unsigned long long Number;

const int MAXN=1000001;
const Number INF=100000000000000000LL;

int N,K,C,M;
Number B[MAXN];
Number F[2][MAXN],Ans;

inline int cmp(const void *a,const void *b)
{
	return *(Number *)a-*(Number *)b;
}

void init()
{
	int i,j,b;
	freopen("divide.in","r",stdin);
	freopen("divide.out","w",stdout);
	scanf("%d%d%d",&N,&K,&C);
	for (i=1;i<=N;i++)
	{
		scanf("%d",&b);
		B[i]=b;
	}
	qsort(B+1,N,sizeof(B[0]),cmp);
	M=N/K;
	Ans=INF;
	for (i=0;i<=1;i++)
	{
		for (j=1;j<=N;j++)
		{
			F[i][j]=INF;
		}
	}
}

void dynamic()
{
	int i,j,k,p;
	Number t,min;
	for (j=K;j<=N;j++)
	{
		F[1][j]=(B[j]-B[1])*(B[j]-B[1])+C;
	}
	Ans=F[1][N];
	for (p=0,i=2;i<=M;i++,p=!p)
	{
		for (j=1;j<=N;j++)
		{
			min=INF;
			for (k=K*(i-1);k<=j-1;k++)
			{
				t=F[!p][k] + (B[j]-B[k+1])*(B[j]-B[k+1]) + C;
				if (t<min)
					min=t;
			}
			F[p][j]=min;
		}
		if (F[p][N] < Ans)
			Ans=F[p][N];
	}
}

int main()
{
	init();
	dynamic();
	cout << Ans;
	return 0;
}