记录编号 |
30589 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[POI 1999] 地图着色 |
最终得分 |
100 |
用户昵称 |
magic |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.761 s |
提交时间 |
2011-10-30 16:34:34 |
内存使用 |
2.10 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
const int maxlong=1000000000;
int n,m;
int data[10005];
long long sum[10005];
long long f[10005][15];
void qsort(int a[],int l,int r);
void qsort(int a[],int l,int r)
{
int i,j,x,y;
i=l;j=r;x=a[(l+r)/2];
while (i<=j)
{
while (a[i]<x) i++;
while (a[j]>x) j--;
if (i<=j)
{
y=a[i];a[i]=a[j];a[j]=y;
i++;j--;
}
}
if (l<j) qsort(a,l,j);
if (i<r) qsort(a,i,r);
}
int abs(int x);
int abs(int x)
{
if (x<0) return -x;else return x;
}
long long min(long long x,long long y);
long long min(long long x,long long y)
{
if (x<y) return x;else return y;
}
int main()
{
freopen("map.in","r",stdin);
freopen("map.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
scanf("%d",&data[i]);
}
qsort(data,1,n);
for (int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+data[i];
}
long long mid,a,b;
for (int i=1;i<=n;i++)
{
mid=(1+i)/2;
a=abs(sum[mid]-data[mid]*(mid));
b=abs(sum[i]-sum[mid]-data[mid]*(i-mid));
f[i][1]=a+b;
}
for (int i=2;i<=n;i++)
{
for (int j=2;j<=m;j++)
{
f[i][j]=maxlong;
if (i>=j)
{
for (int k=1;k<=i-1;k++)
{
if (k>=j-1)
{
mid=(k+1+i)/2;
a=abs(sum[mid]-sum[k]-data[mid]*(mid-k));
b=abs(sum[i]-sum[mid]-data[mid]*(i-mid));
f[i][j]=min(f[i][j],f[k][j-1]+a+b);
}
}
}
}
}
printf("%lld",f[n][m]);
return 0;
}