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
",minn);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/ydw--/p/11357950.html