思路
此题是求将不同位置的士兵移到一行所需要的最少步数。由于步数是整数,可以分解成求x方向上的最小移动步数,再求y方向上的最小移动步数,最后相加即可。
y方向上的最小移动步数可以先对y数组进行排序,求得y方向上的中位数,从而求得最终排成行的纵坐标,就能求出y方向上的最小步数,x方向上也是类似,只是直接球中位数的话最后移动后可能会有些点会重复,这是题目不允许的,因此需要将排序后的x坐标减去相应的下标,来实现不重复的目的,然后一样求中位数,求x方向上的最小移动步数,最后将两个步数加起来就可以了。
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
bool com(int a,int b){
return a<b;
}
int main(){
int n,x[10001],y[10001],i;
cin>>n;
for(i=0;i<n;i++){
cin>>x[i]>>y[i];
}
sort(x,x+n,com);
sort(y,y+n,com);
for(i=0;i<n;i++){
x[i]-=i;
}
sort(x,x+n,com);
int midy=y[n/2];
int midx=x[n/2];
int sum=0;
for(i=0;i<n;i++){
sum+=abs(x[i]-midx)+abs(y[i]-midy);
}
cout<<sum<<endl;
return 0;
}