海岸線為 x 軸,n 個島嶼座標 (x_i, y_i)(y_i > 0)。雷達安裝在海岸線上,覆蓋半徑 d。求最少雷達數覆蓋所有島嶼,若有島嶼 y_i > d 則無解輸出 -1。
(x,y) 可被覆蓋的雷達位置區間為 [x - √(d²-y²), x + √(d²-y²)]。[L_i, R_i]。L_i 升序排序(L_i 相同按 R_i 升序)。pos(初始為第一區間的 R_1)。[L,R]:若 L > pos,需新增雷達,pos = R,計數+1;否則 pos = min(pos, R)(縮小共同覆蓋範圍)。#include <cstdio>
#include <cmath>
#include <algorithm>
struct Seg { double l, r; } seg[1005];
bool cmp(const Seg& a, const Seg& b) {
return a.l < b.l || (a.l == b.l && a.r < b.r);
}
int main() {
int n, d, cas = 0;
while (scanf("%d%d", &n, &d) == 2 && (n||d)) {
bool impossible = false;
for (int i=0;i d) impossible = true;
double delta = sqrt(d*d - y*y);
seg[i].l = x - delta;
seg[i].r = x + delta;
}
if (impossible) { printf("Case %d: -1\n", ++cas); continue; }
std::sort(seg, seg+n, cmp);
int ans = 1;
double pos = seg[0].r;
for (int i=1;i pos) { ++ans; pos = seg[i].r; }
else pos = std::min(pos, seg[i].r);
}
printf("Case %d: %d\n", ++cas, ans);
}
return 0;
}
l 升序,r 升序(保證同起點區間優先處理較短者)。pos = min(pos, R) 是關鍵:維護所有已覆蓋區間的交集右端點,確保後續區間判斷正確。double 足夠,輸出整數無精度問題。O(n log n),空間 O(n)。Radar Installation 是「區間點覆蓋」貪心的教科書級應用。幾何轉區間、排序掃描、維護交集右端點,三步構建完整解法。掌握此模板可解決所有類似「最少資源覆蓋需求區間」問題。