NOIP学习之简单排序:158.士兵站队

测试链接
题目描述
在一个划分成网格的操场上, nn 个士兵散乱地站在网格点上,由整数坐标 (x,y)(x,y) 表示。

士兵们可以沿网格边上、下左右移动一步,但在同时刻任一网格点上只能有名士兵。

按照军官的命令,们要整齐地列成个水平队列,即排成 队列,即排成 (x,y),(x+1,y), …,(x+n-1,y)(x,y),(x+1,y),…,(x+n−1,y)。请求出如何选择 xx 和 yy 的值才能使士兵们以最少的总移动步数排成一列。

输入格式
输入的第一行是一个整数,代表士兵数 nn。​
代表第 ii 个士兵的坐标。
代表第 ii 个士兵的坐标。

输出格式
输出一行一个整数,代表答案。

输入输出样例
输入 #1
5
1 2
2 2
1 3
3 -2
3 3
8
输出 #1

#include
#include
#include
#include
using namespace std;
const int maxn=10005;

struct node
{
    int x,y;
}e[maxn];

int n;
long long ans=0;

int cmpy(node a,node b)
{
    return a.y<b.y;
}

int cmpx(node a,node b)
{
    return a.x<b.x;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&e[i].x,&e[i].y);
    sort(e+1,e+n+1,cmpy);
    int midy=e[(1+n)/2].y;
    for(int i=1;i<=n;i++)
        ans+=abs(e[i].y-midy);
    sort(e+1,e+n+1,cmpx);
    for(int i=1;i<=n;i++)
        e[i].x=e[i].x-i;
    sort(e+1,e+n+1,cmpx);
    int midx=e[(1+n)/2].x;
    for(int i=1;i<=n;i++)
        ans+=abs(e[i].x-midx);
    cout<<ans<<endl;
    return 0;
}

你可能感兴趣的:(NOIP学习)