题目大意:有N个士兵,每个士兵开始站的坐标是(x,y),现在使得将N个士兵站在同一个水平线(即所有士兵的y坐标相同)并且x坐标相邻,每个士兵每次可以移动一个位置(分别在x和y方向移动)。求出最少的移动步数。
分析题目:首先这个是可以分开看的,横纵坐标没有联系。
Y坐标:仅仅求出一个简单的中位数即可,然后一次求出距离这个中位数的值。
X坐标:这里我主要想讲讲这个X坐标的排序。题目中要求,x坐标必须连续排列(不能够存在重叠),于是,在这里这个操作是:
一,先将x的序列排序
二,将每个x的序列减去当前的下标值;思考:这里为啥要这样操作?有这样一个操作之后就可以保证连续排列。(如果原来本身就是相邻的部分,那么这一部分就不存在了)
三,再对新的x的序列进行排序,找到中位数,依次相减即可。
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
const int N = 10000;
int x[N],y[N];
int main()
{
int n,i,j;
while(cin>>n)
{
for(i = 0;i<n;i++)
cin>>x[i]>>y[i];
sort(x,x+n);
for(i = 0;i<n;i++)
x[i] -= i;
sort(x,x+n);
sort(y,y+n);
int ans,ansx,ansy;
ans = 0;
ansx = x[n/2];
ansy = y[n/2];
for(i = 0;i<n;i++)
{
ans += abs(x[i]-ansx);
ans += abs(y[i]-ansy);
}
cout<<ans<<endl;
}
return 0;
}