题意描述
格兰德的N名士兵随机散布在全国各地。 Gridland中的位置由整数坐标对(x,y)给出。士兵们可以移动,一个士兵可以向上,向下,向左或向右移动一个单位(因此,他可以将x或他的y坐标改变1或-1)。士兵想要相互相邻的水平线(所以他们的最终位置是(x,y),(x + 1,y),…,(x + N-1,y) x和y)。整数x和y,以及沿水平线的士兵的最终顺序是任意的。 目标是尽量减少所有士兵的入场次数。 两名或两名以上的士兵在同一时间绝对不能占据同一位置。
输入
输入的第一行包含整数N,1 <= N <= 10000,士兵数。 输入的下面的N行包含的士兵的初始位置:对于每个i,1 <= I <= N,第(i + 1)第一输入文件的行包含一对整数x的[i]和Y [我用单个空白字符分隔,表示第i个士兵的坐标,-10000 <= x [i],y [i] <= 10000。
产量 ##
输出的第一行和唯一一行应包含使士兵相互相邻的水平线的最小移动次数。
样品输入
五
1 2
2 2
1 3
3 -2
3 3
样品输出
8
题意分析
- 本题使用到中位数和quickSort(qsort)函数
- 纵轴上走的最少步数是:y1,y2,y3,…,yn. (已经排好序的序列) y_mid = y[n/2], y_steps = ∑ ( |y[i]-y_mid| ).
- 横轴上走的最少步数是:x1,x2,x3,…,xn (已经排好序的序列)横轴的中位数是 (x[i]-i-1) 排序后的序列的中位数. x_mid = z[n/2] , x_steps = ∑( |z[i]-x_mid| )
- 结果: y_steps+x_steps.
代码
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
#define MAX 10005
int cmp(void const *a,void const *b)
{
return *((int*)a) - *((int*)b);
}
int Abs(int x)
{
if(x > 0)
return x;
else
return -x;
}
int main()
{
int n;
// freopen("a.txt","r",stdin);
while(cin >> n)
{
int x[MAX] , y[MAX] , z[MAX];
int i;
int num = 0;
for(i = 0; i < n; ++i)
{
cin >> x[i] >> y[i];
}
qsort(x,n,sizeof(int),cmp);
qsort(y,n,sizeof(int),cmp);
for(i = 0; i < n; ++i)
z[i] = x[i] - i - 1;
qsort(z,n,sizeof(int),cmp);
for(i = 0; i < n; ++i)
{
num += ( Abs(y[i]-y[n/2]) + Abs(z[i]-z[n/2]) );
}
cout << num << endl;
}
return 0;
}