如题:http://poj.org/problem?id=1723
题目大意:将N个直角坐标系中的点变成一条连续水平线(x,y),(x+1,y).....(x+N-1,y) 任意2个点不能重合 一次移动一步
输入:第一行N,下面N行坐标
输出:最少走的步数
这是一道用到排序的题目,首先将y坐标小到大排序,求出中位数ky=y【N/2】,因为易得,最少次数一定是点移动到中位数这个点,在y上移动的步数sum+=abs(ky-y[i])
类似,然后对x从小到大排序,x上移动需要的步数为将x【0】,x[1]...x[n-1]移动到从kx开始的N个数,kx,kx+1.....kx+N-1,步数:abs(kx+0-x[0])+abs(kx+1-x[1])+....abs(kx+N-1-x[N-1]) 最小 ,易得kx为新序列X【i】-i的中位数,x[i]-=i;求出后sum+=abs(x[i](新)-kx);即为题目所需的最终结果.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAXN 10005
int x[MAXN];
int y[MAXN];
int cmp(const void * a,const void * b)
{
return *(int *)a-*(int *)b;
}
int main()
{
int N,i=0,sum=0,kx,ky;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d %d",&x[i],&y[i]);
}
qsort(x,N,sizeof(int),cmp);
for(i=0;i<N;i++)
x[i]-=i;
qsort(y,N,sizeof(int),cmp);
qsort(x,N,sizeof(int),cmp);
kx=x[N/2];
ky=y[N/2];
for(i=0;i<N;i++)
{
sum+=(abs(y[i]-ky)+abs(x[i]-kx));
}
printf("%d",sum);
return 0;
}