比赛 20111021 评测结果 AAAWWWWWWA
题目名称 地图着色 最终得分 40
用户昵称 Truth.Cirno 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-10-21 22:12:44
显示代码纯文本
#include <cstdio>
using namespace std;

int n,m,a[3002],b[3002],posb[3002],pos[12],postemp[12],bfm1,rest,minnum=2000000000;

void swap(int &a,int &b)
{
	int temp;
	temp=a;
	a=b;
	b=temp;
}

void qqsort(int l,int r)
{
	int ll,rr,temp;
	ll=l;
	rr=r;
	temp=a[(l+r)/2];
	while (ll<=rr)
	{
		while (a[ll]<temp)
			ll++;
		while (temp<a[rr])
			rr--;
		if (ll<=rr)
		{
			swap(a[ll],a[rr]);
			ll++;
			rr--;
		}
	}
	if (l<rr)
		qqsort(l,rr);
	if (ll<r)
		qqsort(ll,r);
}

void qqsort2(int l,int r)
{
	int ll,rr,temp;
	ll=l;
	rr=r;
	temp=b[(l+r)/2];
	while (ll<=rr)
	{
		while (b[ll]>temp)
			ll++;
		while (temp>b[rr])
			rr--;
		if (ll<=rr)
		{
			swap(b[ll],b[rr]);
			swap(posb[ll],posb[rr]);
			ll++;
			rr--;
		}
	}
	if (l<rr)
		qqsort2(l,rr);
	if (ll<r)
		qqsort2(ll,r);
}

void qqsort3(int l,int r)
{
	int ll,rr,temp;
	ll=l;
	rr=r;
	temp=postemp[(l+r)/2];
	while (ll<=rr)
	{
		while (postemp[ll]<temp)
			ll++;
		while (temp<postemp[rr])
			rr--;
		if (ll<=rr)
		{
			swap(postemp[ll],postemp[rr]);
			ll++;
			rr--;
		}
	}
	if (l<rr)
		qqsort3(l,rr);
	if (ll<r)
		qqsort3(ll,r);
}

void solve(void)
{
	int i,j,k,temp=0;
	for (i=1;i<=m-1;i++)
		postemp[i]=pos[i];
	qqsort3(1,m-1);
	for (i=1;i<=m-1;i++)
		for (j=postemp[i-1]+1,k=postemp[i];j<k;j++,k--)
			temp+=a[k]-a[j];
	for (j=postemp[i-1]+1,k=n;j<k;j++,k--)
		temp+=a[k]-a[j];
	if (temp<minnum)
		minnum=temp;
}

void filllist(int m1,int m2,int deep)
{
	int i;
	pos[bfm1+deep]=posb[m1];
	if (deep+1==rest)
		solve();
	else
		for (i=m1+1;i<=m2;i++)
			filllist(i,m2,deep+1);
}

int main(void)
{
	freopen("map.in","r",stdin);
	freopen("map.out","w",stdout);
	int i,m1,m2,temp;
	scanf("%d %d",&n,&m);
	for (i=1;i<=n;i++)
		scanf("%d",&a[i]);
	qqsort(1,n);
	for (i=1;i<=n-1;i++)
	{
		b[i]=a[i+1]-a[i];
		posb[i]=i;
	}
	qqsort2(1,n);
	temp=b[m];
	for (i=m+1;i<=n;i++)
		if (temp!=b[i])
			break;
	m2=i-1;
	for (i=m-1;i>=1;i--)
		if (temp!=b[i])
			break;
	m1=i+1;
	rest=m-m1+1;
	bfm1=m1-1;
	for (i=1;i<=m1-1;i++)
		pos[i]=posb[i];
	for (i=m1;i<=m2;i++)
		filllist(i,m2,1);
	printf("%d\n",minnum);
	fclose(stdin);
	fclose(stdout);
	return(0);
}