# 分析:
可能有人跟我一样在看到一个士兵可以向上、向下、向左或向右移动一单位时,想到搜索,但是又当我看到了数据范围时~~数据有点水或许能过~~,我果断放弃了这个想法。紧接着又看到了士兵们在水平线上的最终顺序是任意的,那这不就是一种贪心嘛。
# 思路
先给坐标排个序,然后再计算好坐标的偏移量,然后再排序一遍,之后取中位数找到水平线上的中间位置,([不懂中位数的点这里](https://www.luogu.com.cn/article/pa02t2af)),然后再计算士兵到达目的地的移动次数并累加即可(记得取最对值)。
# 代码
```cpp
#include<bits/stdc++.h>
#include<queue>
#define N 10005
#define f first
#define s sceond
#define IOS ios::sync_with_stdio(false)
#define CT cin.tie(NULL)
#define Ct cout.tie(NULL)
#define l_queue priority_queue <int,vector<int>,greater<int> >
#define p_queue priority_queue <int>
//快读快写
inline void read(int& a){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}a=s*w;}
void write(int x){if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');}
using namespace std;
int n,x,y,ans,cnt;
int a[N],b[N];
bool pd(int _){
if(_%2==0) return 1;
else return 0;
}
int main(){
read(n);
for(int i=1;i<=n;i++){
read(a[i]);read(b[i]);
}
//排序
sort(a+1,a+1+n);sort(b+1,b+1+n);
for(int i=1;i<=n;i++) a[i]-=i;//计算偏移量
sort(a+1,a+1+n);//记得再排序一遍哦
//这里时计算中位数
if(pd(n)){
int w=n>>1;
x=(a[w]+a[w+1])>>1;
y=(b[w]+b[w+1])>>1;
}
else{
int w=n>>1;
x=a[w+1];
y=b[w+1];
}
//累加计算
for(int i=1;i<=n;i++) ans=ans+abs(a[i]-x)+abs(b[i]-y);
write(ans);
return 0;
}
求各位赏蒟蒻一个赞