标签:io os ar for sp amp size bs as
在N*M的矩阵里,分布了,N*N个人,每行N个,且只能左右移动,求把所有人合并成N*N正方形所需的最小代价。
因为每个人只能在本行移动,所以预处理出来每行的每种合并方式,再判断列的
#include "stdio.h" #include "string.h" #include "iostream" #include "algorithm" using namespace std; int inf=0x3f3f3f3f; int Fabs(int a) { if (a<0) return -a; else return a; } int Min(int a,int b) { if (a<b) return a; else return b; } struct node { int num; int x[210]; }mark[210]; int main() { int n,m,i,j,k,sum,ans; int dp[210][210]; while (scanf("%d%d",&n,&m)!=EOF) { if (n==0 && m==0) break; memset(mark,0,sizeof(mark)); for (i=1;i<=n*n;i++) { scanf("%d%d",&j,&k); mark[j].num++; mark[j].x[mark[j].num]=k; } for (i=1;i<=n;i++) sort(mark[i].x+1,mark[i].x+1+n); memset(dp,0,sizeof(dp)); for (i=1;i<=n;i++) for (j=1;j<=m-n+1;j++) for (k=1;k<=n;k++) dp[i][j]+=Fabs(mark[i].x[k]-j-k+1); ans=inf; for (j=1;j<=m-n+1;j++) { sum=0; for (i=1;i<=n;i++) sum+=dp[i][j]; ans=Min(sum,ans); } printf("%d\n",ans); } return 0; }
标签:io os ar for sp amp size bs as
原文地址:http://blog.csdn.net/u011932355/article/details/39961335