题目描述
在一个划分成网格的操场上,n个士兵散乱地站在网格点上。网格点用整数坐标(x,y)表示。士兵们可以沿网格边往上、下、左、右移动一步,但在同一时刻任一网格点上只能有一名士兵。按照军官的命令,士兵们要整齐地列成一个水平队列,即排列成(x,y),(x+1,y),…,(x+n-1,y)。如何选择x和y的值才能使士兵们以最少的总移动步数排成一行。
编程计算使所有士兵排成一行需要的最少移动步数。
输入
第1行是士兵数n,1≤n≤10000。接下来n行是士兵的初始位置,每行有2个整数x和y,-10000≤x,y≤10000。
输出
一个数据,即士兵排成一行需要的最少移动步数。
样例输入
5 1 2 2 2 1 3 3 -2 3 3
样例输出
8
提示
AC代码:
#include<bits/stdc++.h>
using
namespace
std;
const
int
MS=1e4+5;
int
n,x[MS],y[MS],tx,ty;
int
main(){
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);
tx=0;ty=0;
for
(
int
i=0;i<n;i++){
tx+=
abs
(x[i]-x[n/2]);
ty+=
abs
(y[i]-y[n/2]);
}
tx+=ty;
printf
(
"%d\n"
,tx);
return
0;
}