#include<iostream>
#include<algorithm>
using namespace std;
int N,x[10000],y[10000],rx,ry,t,sum;
int main(){
cin>>N;
for(int i=0;i<N;i++){
cin>>x[i]>>y[i];
}
sort(y,y+N);
ry=y[N/2];
sort(x,x+N);
for(int i=0;i<N;i++){
x[i]-=i;
}
sort(x,x+N);
rx=x[N/2];
sum=0;
for(int i=0;i<N;i++){
t=y[i]-ry;
if(t<0)
t=-t;
sum+=t;
}
for(int i=0;i<N;i++){
t=x[i]-rx;
if(t<0)
t=-t;
sum+=t;
}
cout<<sum<<endl;
return 0;
}
题意:
给定N个点,将它们移到同一行,使得移动的总次数最小
思路:
1.x与y方向的移动互不干扰;
2.将y方向的坐标排序,取中位数,那么一定是移动到这一行
3. x方向排序,则x[i]与移动到相应位置后的点的坐标顺序相同
令x'[i] = x[i]-i;
则x[i]与x'[i]之间有个一一一对应,且只需把x'[i]移到同一个位置(转化为前述问题)