比赛 4043级NOIP2022欢乐赛5th 评测结果 AAAAAAAAAA
题目名称 地图着色 最终得分 100
用户昵称 op_组撒头屯 运行时间 0.858 s
代码语言 C++ 内存使用 22.49 MiB
提交时间 2022-11-14 19:14:22
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N=3000+5;
  5. const int M=10+5;
  6. int n,m;
  7. int p[N];
  8. ll f[N][M],sum[N][N]={0};
  9. inline int abss(int x){
  10. return (x<0)?-x:x;
  11. }
  12. int main(){
  13. freopen ("map.in","r",stdin);
  14. freopen ("map.out","w",stdout);
  15. scanf("%d%d",&n,&m);
  16. for (int i=1;i<=n;i++)scanf("%d",&p[i]);
  17. sort(p+1,p+n+1);
  18. for (int i=1;i<=n;i++){
  19. for (int j=1;j<=n;j++){
  20. sum[i][j]=sum[i][j-1]+abss(p[i]-p[j]);
  21. }
  22. }
  23. memset(f,0x3f,sizeof(f));
  24. f[0][0]=0;
  25. for (int i=1;i<=n;i++){
  26. f[i][1]=sum[(i+1)/2][i];
  27. for (int j=2;j<=m;j++){
  28. for (int k=j-1;k<i;k++){
  29. f[i][j]=min(f[i][j],f[k][j-1]+sum[(i+k+1)/2][i]-sum[(i+k+1)/2][k]);
  30. }
  31. }
  32. }
  33. ll ans=f[0][1];
  34. for (int i=1;i<=m;i++)ans=min(ans,f[n][i]);
  35. printf("%lld\n",ans);
  36. return 0;
  37. }
  38.