1. 程式人生 > >牛客網 - 怪盜基德 & 月之瞳寶石

牛客網 - 怪盜基德 & 月之瞳寶石

題目連結:https://ac.nowcoder.com/acm/contest/322/J
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld

題目描述 

在這片寂靜的夜色之下,他就這樣靜靜的降臨在我的面前,他的眼神就好像能看透了一切,露出了無所畏懼的笑容。一襲白斗篷和一頂白禮帽,不帶一絲多餘的動作,他的臉在單眼眼睛跟逆光之下。
    to 世紀末的魔術師
                    By the mysterious man
怪盜基德在上次失敗後,對美麗的月之瞳寶石非常覬覦,他想要得到它,以世紀末的魔術師的名義。但是卻遇到了重重機關阻攔,眼看到了月之瞳寶石盒之前,怪盜基德卻停下了腳步。
“世界上有些謎,還是讓它永遠成為謎比較好”
話音剛落,只見一片白霧,待霧散開之時,他已經消失在月色之中。
在怪盜基德走後,你潛入進去,卻發現,上面篆刻著一段奇怪的話:
  在縹緲的宇宙中,有一條穿越時空的隧道,在這條隧道中,有著許多星體和能源體,他們都排列在一條直線上,對於每個星體而言,他們都需要能源體的照耀才能夠存活於這條時空隧道當中,當然一個能源體可以同時為多個星體提供能源(對於一個能源體來說,也可能沒有星體需要它提供能源)。但是,有所限制的是每個能源體只能為與自身相距x之內的星體提供能源。現在需要你找到最小的x,使得每個星體都能夠得到能源(即每個星體必須得到至少一個能源體的照耀)。
現在是你作為怪盜基德的徒弟大展身手的時候了。

輸入描述:

輸入共三行,第一行有兩個數n和m(1 <= n, m <= 1e5),分別代表有n個星體,m個能源體。
第二行有n個數a1, a2, ... an,代表n個星體的位置。(-2e9 <= a[i] <= 2e9)
第三行有m個數b1, b2, ... bm,代表m個能源體的位置。(-2e9 <= b[j] <= 2e9)

輸出描述:

輸出最小的x,滿足每個星體都有至少一個能源體為其提供能源。

輸入

3 2
-2 2 4
-3 0
4 3
7 -2 5 6
1 8 -3

輸出

4
3

說明

對於3個位置的星體,與其距離最近的能源體距離分別為1,2,4,所以能源體照耀的範圍只需為4即可

解題思路

暴力找一遍,求出每個星體離能源體最近的距離,並求出它們的最大值。當然,可以用二分查詢。

#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int n, m;
    long long a[100005], b[100005], maxx = 0, minn;
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++)
        scanf("%lld", &a[i]);
    for (int i = 0; i < m; i++)
        scanf("%lld", &b[i]);
    sort(a, a + n);
    sort(b, b + m);
    for (int x = 0, i = 0; i < n; i++)
    {
        while (a[i] > b[x] && x < m - 1)
            x++;
        minn = min(fabs(b[x] - a[i]), fabs(b[x - 1] - a[i]));
        maxx = max(minn, maxx);
    }
    printf("%lld\n", maxx);
    return 0;
}