一些士兵站在矩阵的一些方格内,现要把他们移动到一横排,并连续地排成一队,士兵一次可以选择四个方向中的一个方向移动一格,求最少需要移动多少步才能完成要求。
即所有士兵的y坐标相同并且x坐标相邻。
第一行输入一个正整数 n�,表示士兵的数量。(1≤n≤10000)(1≤�≤10000)
接下来 n� 行,每行两个数,代表第 i� 个士兵所处位置的横纵坐标 Xi,Yi��,��。(−10000≤Xi,Yi≤10000)(−10000≤��,��≤10000)
输出最少移动步数。
- 5
- 1 2
- 2 2
- 1 3
- 3 -2
- 3 3
8
时间限制:1 s
内存限制:256 M
100% 的数据保证 1≤n≤10000,−10000≤Xi,Yi≤10000
- #include <stdio.h>
- #include <stdlib.h>
- void merge_sort(int* arr, int l, int r) {
- if (r - l <= 1) return;
- int mid = (r + l) / 2;
- merge_sort(arr, l, mid);
- merge_sort(arr, mid, r);
- int* temp = (int*)malloc(sizeof(int) * (r - l));
- int p1 = l, p2 = mid, k = 0;
- while (p1 < mid || p2 < r) {
- if (p2 == r || (p1 < mid && arr[p1] <= arr[p2]))
- temp[k++] = arr[p1++];
- else
- temp[k++] = arr[p2++];
- }
- for (int i = l; i < r; i++) arr[i] = temp[i - l];
- free(temp);
- return;
- }
- int main() {
- int n;
- scanf("%d", &n);
- int* a = (int*)malloc(sizeof(int) * n);
- int* b = (int*)malloc(sizeof(int) * n);
- for (int i = 0; i < n; i++) scanf("%d %d", &a[i], &b[i]);
- merge_sort(b, 0, n);
- merge_sort(a, 0, n);
- for (int i = 0; i < n; i++) a[i] -= i;
- merge_sort(a, 0, n);
- int Y = b[n / 2], X = a[n / 2];
- int costy = 0, costx = 0;
- for (int i = 0; i < n; i++) costy += abs(b[i] - Y), costx += abs(a[i] - X);
- printf("%d", costx + costy);
- return 0;
- }