HDU 4311ミーティングポイント-1

#ミーティングポイント-1

問題の説明
TJU-ACMが確立して以来、10年が経ちました。そして、今年のすべての引退TJU-ACMersは、第10周年を祝うために一緒に取得したいです。引退TJU-ACMersは、世界中のさまざまな場所に住んでいるかもしれないので、すべて引退しTJU-ACMersの合計移動時間を最小限にするために、この会議を祝うために場所を見つけるのは難しいかもしれません。
NはTJU-ACMersが上の自分の家を持って引退した時に無限の整数グリッドがあります。彼らは、誰かの家である一般的な出会いの場、で団結することを決定しました。任意の所与のセルから、わずか4隣接セルは、時間の1個の単位で到達可能です。
例えば:(X、Y)から到達することができる(X-1、Y)、(X + 1、Y)、(X、Y-1)、(X、Y + 1)。
すべての引退TJU-ACMersの旅行時間の総和を最小化し、共通の待ち合わせ場所を見つけます。

入力は、
最初の行は、TがTのテストケースがあり表す整数です。(0 <T <= 10)
各テストケースについて、最初の行は整数N N TJU-ACMersがリタイアされる表します。(0 <N <= 100000)、次のn行それぞれは、2つの整数xを含み、Yは、i番目TJU-ACMerの座標。(-10 ^ 9 <= xと、Y <= 10 ^ 9)

出力
各テストケースの場合、出力走行時間の最小合計。

サンプル入力
4
6
-4 -1
-1 -2
2-4
0 2
0 3
5 -2
6
0 0
2 0
-5 -2
2 -2
-1 2
4 0
5
-5 1
-1 3
3 1
- 3 1
1 -1
10
-1 -1
-3 2
-4 4
5 2
5 -4
3 -1
4 3
-1 -2
3 4
-2 2

サンプル出力
26
20
20
56
ヒント

最初のケースでは、ミーティングポイントは(-1、-2)です。第二は、(0,0)、第三は、(3,1)であり、最後は(-2,2)であります

[思考]:まず、我々は最初のマンハッタン距離が何であるかを知らなければなりません
マンハッタン距離は、ABS(XI - XJ)である+ ABS (YI - YJ)
ので、私たちが知ることができるの距離とY、距離xを考慮することである
データは、我々は可能な範囲その複雑さはO(N ^ 2)は、この問題によっては不可能である
一次元に変換した場合、我々は、容易にプレフィックスを発生し、実際には、2つのプレフィックスは、一次元を維持するために使用することができ、
我々は最初にそれをとることができます中心点として点は、処理され、対応する接頭辞することができ、
位置の値は、その後、我々は規則配列に対応するy値のY位置、Xの規則配列に対応する現在のポイントをしたいxは
選択され、そうポイントは、すべての点は、2つの部分に分割され、X X <現在選択された点のX、X>現在選択された点
*(X - (X最小値のx)が考慮すべきは、それが対応する、であり、小さいです規則正しいアレイ+ 1)の値の数- Xプレフィックスや
状況を考慮し、大その最大値に対応するプレフィックス-プレフィックスと現在のポイント- (マイナス数ポイント数(現在点+ 1))*(X -最小値のX)
及び2つ、Yは状況を考えます 同じである
Oのコピーを前処理するので、最大値は、O(N)時間で得ることができる(N * N + Nログ )
コード取り付け

#include <bits/stdc++.h>
#define mem(x) memset(x, 0, sizeof(x))
using namespace std;
typedef long long LL;
const int MAXN = 100005;
struct node
{
    LL num, x, y, sumx_num, sumy_num;
} arr[MAXN];
LL sumx[MAXN], sumy[MAXN];
int n;
bool cmp(const node &a, const node &b)
{
    return a.x < b.x;
}
bool cmp1(const node &a, const node &b)
{
    return a.y < b.y;
}
void Init()
{
    mem(sumx);
    mem(sumy);
}
int main()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        Init();
        LL xmins, ymins;
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            scanf("%lld%lld", &arr[i].x, &arr[i].y);
            arr[i].num = i;
        }
        sort(arr, arr + n, cmp);
        arr[0].sumx_num = 0;
        xmins = arr[0].x;
        for (int i = 1; i < n; i++)
        {
            sumx[i] = sumx[i - 1] + arr[i].x - arr[0].x;
            arr[i].sumx_num = i;
        }
        sort(arr, arr + n, cmp1);
        arr[0].sumy_num = 0;
        ymins = arr[0].y;
        for (int i = 1; i < n; i++)
        {
            sumy[i] = sumy[i - 1] + arr[i].y - arr[0].y;
            arr[i].sumy_num = i;
        }
        LL sum = __LONG_LONG_MAX__;
        for (int i = 0; i < n; i++)
        {
            LL a = sumx[n - 1] - sumx[arr[i].sumx_num] - (n - 1 - arr[i].sumx_num) * (arr[i].x - xmins) + ((arr[i].sumx_num + 1) * (arr[i].x - xmins) - sumx[arr[i].sumx_num]);
            LL b = sumy[n - 1] - sumy[arr[i].sumy_num] - (n - 1 - arr[i].sumy_num) * (arr[i].y - ymins) + ((arr[i].sumy_num + 1) * (arr[i].y - ymins) - sumy[arr[i].sumy_num]);
            sum = min(sum, a + b);
        }
        printf("%lld\n", sum);
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/qq136155330/p/10990726.html