標籤: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;}
HDU 3687 暴力