/**
* poj1723
* 排序+中位数
* 目的纵坐标很容易想到是中位数,其实横坐标也一样
* 如果目的x坐标是a,a+1,a+2,那么移动步数应该是sum(|x[i] - a - i|)
* 那么a是x[i] - i的中位数就可以了
* 不用担心步数重复的问题;合理安排顺序一定可以保证步数够用,所有绕远都可以通过改变顺序的方法解决
*/
#include <iostream>
#include <stdlib.h>
using namespace std;
int abs(const int x, const int y){
return (x > y) ? x-y : y-x;
}
int cmp(const void* a,const void* b){return *((int*)a)-*((int*)b);}
int x[10001],y[10001],xx[10001];
int main(){
int n,count = 0,dest_x,dest_y;
cin >> n;
for(int i=0;i<n;++i){
cin >> x[i] >> y[i];
}
qsort(y,n,sizeof(int),cmp);
dest_y = y[n/2];
qsort(x,n,sizeof(int),cmp);
for(int i=0;i<n;++i){
xx[i] = x[i] - i;
}
qsort(xx,n,sizeof(int),cmp);
dest_x = xx[n/2];
//cout << dest_x << " " << dest_y << endl;
for(int i=0;i<n;++i){
count += abs(xx[i],dest_x);
count += abs(y[i],dest_y);
}
cout << count << endl;
return 0;
}
poj1723 排序+中位数
最新推荐文章于 2021-08-03 15:25:37 发布