HZOJ-251:士兵

 

题目描述

​ 一些士兵站在矩阵的一些方格内,现要把他们移动到一横排,并连续地排成一队,士兵一次可以选择四个方向中的一个方向移动一格,求最少需要移动多少步才能完成要求。

​ 即所有士兵的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 
#include 
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;
}

你可能感兴趣的:(算法题,算法,数据结构)