比赛 |
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);
}