比赛 |
4043级NOIP2022欢乐赛5th |
评测结果 |
AAAAAAAAAA |
题目名称 |
地图着色 |
最终得分 |
100 |
用户昵称 |
op_组撒头屯 |
运行时间 |
0.858 s |
代码语言 |
C++ |
内存使用 |
22.49 MiB |
提交时间 |
2022-11-14 19:14:22 |
显示代码纯文本
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int N=3000+5;
- const int M=10+5;
- int n,m;
- int p[N];
- ll f[N][M],sum[N][N]={0};
- inline int abss(int x){
- return (x<0)?-x:x;
- }
- 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",&p[i]);
- sort(p+1,p+n+1);
- for (int i=1;i<=n;i++){
- for (int j=1;j<=n;j++){
- sum[i][j]=sum[i][j-1]+abss(p[i]-p[j]);
- }
- }
- memset(f,0x3f,sizeof(f));
- f[0][0]=0;
- for (int i=1;i<=n;i++){
- f[i][1]=sum[(i+1)/2][i];
- for (int j=2;j<=m;j++){
- for (int k=j-1;k<i;k++){
- f[i][j]=min(f[i][j],f[k][j-1]+sum[(i+k+1)/2][i]-sum[(i+k+1)/2][k]);
- }
- }
- }
- ll ans=f[0][1];
- for (int i=1;i<=m;i++)ans=min(ans,f[n][i]);
- printf("%lld\n",ans);
- return 0;
- }
-