1 条题解

  • 0
    @ 2026-10-26 22:20:37

    思路与算法

    按到第一系统的距离平方排序,枚举已覆盖前缀,剩余后缀到第二系统的最大距离给第二半径;区别于最长非上升导弹拦截题。

    按上述模型建立状态或枚举对象,依代码中的顺序处理输入并输出完整答案。

    正确性说明

    固定第一半径后,所有未覆盖点只能交给第二系统,第二半径平方的最小值就是它们到第二系统的最大平方距离。最优第一半径可收缩到0或某颗导弹距离,因此排序枚举所有前缀和0完整覆盖最优选择。

    复杂度

    O(n log n)时间、O(n)距离存储,后向扫描线性。

    易错点

    必须包含一个系统半径0的情形;重复距离可以在同一值全部纳入,扫描中的中间切分只会高估同值最终切分,不会产生低于可行最优的结果。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        long long x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        int n;
        cin >> n;
        vector<pair<long long, long long>> a(n);
        for (auto &v : a) {
            long long x, y;
            cin >> x >> y;
            v = {(x - x1) * (x - x1) + (y - y1) * (y - y1), (x - x2) * (x - x2) + (y - y2) * (y - y2)};
        }
        sort(a.begin(), a.end());
        long long s = 0, ans = LLONG_MAX;
        for (int i = n - 1; i >= 0; i--) {
            ans = min(ans, a[i].first + s);
            s = max(s, a[i].second);
        }
        ans = min(ans, s);
        cout << ans << "\n";
    }
    
    • 1

    信息

    ID
    1900
    时间
    1000ms
    内存
    128MiB
    难度
    普及−
    标签
    递交数
    0
    已通过
    0
    上传者