您的位置:首页 > 其它

poj1723 排序+中位数

2014-03-12 08:18 218 查看
/**
*  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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: