P1889 士兵站队(洛谷)

题目描述
在一个划分成网格的操场上, 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。
第 22 到 (n + 1)(n+1) 行,每行 22 个整数,第 (i + 1)(i+1) 行的整数 x_i, y_ix i ,y i代表第 ii 个士兵的坐标。

输出格式
输出一行一个整数,代表答案。
输入输出样例
输入 #1
5
1 2
2 2
1 3
3 -2
3 3
输出 #1
8
说明/提示
对于 100%100% 的数据,保证 1 \leq n \leq 100001≤n≤10000,-10000 \leq x,y \leq 10000−10000≤x,y≤10000。

#include<bits/stdc++.h>
using namespace std;
int x[10500],y[10500];
int main(){
    int n,x1,y1,ans=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d%d",x+i,y+i);
    }
    sort(x,x+n);sort(y,y+n);
    for(int i=0;i<n;i++){
        x[i]-=i;
    }
    sort(x,x+n);
    x1=x[(n-1)/2];y1=y[(n-1)/2];
    for(int i=0;i<n;i++){
        ans+=abs(x[i]-x1);
        ans+=abs(y[i]-y1);
    }
    printf("%d",ans);
    return 0;
}
发布了79 篇原创文章 · 获赞 79 · 访问量 2143

猜你喜欢

转载自blog.csdn.net/dgyshy/article/details/105029150