National Day Parade(hdu3687 模拟 easy
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3687
一开始没注意到只能左右移动 所以一行是固定只有n个人的
还有 给你的是n*m矩阵 人站n*n的矩阵 所以范围又缩小了 只有m-n+1种情况
so 枚举过去就可以了
一开始我都没注意到这两个条件 还以为超级难 其实枚举就好了
代码:
#include<bits/stdc++.h> using namespace std; struct ydw { int x,y; }a[60*60]; bool cmp(ydw a,ydw b) { if(a.x!=b.x)return a.x<b.x; return a.y<b.y; } int main() { int i,k,j,n,m; while(scanf("%d%d",&n,&m),n||m) { k=1; int ki=n*n; for(i=1;i<=ki;i++)scanf("%d%d",&a[i].x,&a[i].y); sort(a+1,a+1+ki,cmp);//排个序就简单好多 int minn=1e9; for(i=1;i<=m-n+1;i++)//每种目标看过去 { int l=i; int sum=0; for(j=1;j<=n;j++)//目标的每行 { l=i;//刚写的时候没注意这里要重新赋值 因为这是重新的一行了 for(int o=(j-1)*n+1;;o++) { if(a[o].x!=j)break; sum+=fabs(a[o].y-l); l++; } } minn=min(minn,sum); } printf("%d\n",minn); } return 0; }