每个区间至少包含一个点,问最少需要多少个点:按右端点升序排列即可 将每个岛屿转化为区间,即这个岛能被哪个区间的雷达扫描到,可得区间为 (x - sqrt (R * R - y * y ) , x + sqrt (R * R - y * y )) 问题等价完成两个端点,对其中一个进行升序排列,可用 pair ,其 pair.first 在 sort 时对其升序排序!!!!因为其为浮点数受其精度的影响,所以要 + 1e-6 来消除浮点误差 #include <bits/stdc++.h> using namespace std; const int MA = 1010; pair <double, double> XD[MA];//小岛在哪个范围内可以被搜到 const int INS = 1e-6;//消除浮点误差 int main() { int n,R,ok = 1;//可能 y > R scanf("%d%d",&n,&R); for (int i = 0; i < n; i++) { int x,y; scanf("%d%d",&x,&y); if(ok && R*R >= y*y){ double len = sqrt(R*R-y*y); XD[i].first = x+len; XD[i].second = x-len; } else ok = 0; } if(!ok) printf("-1\n"); else{ sort (XD,XD+n); int ans = 0;//记录雷达个数 double pos; for (int i = 0; i < n; i++){ if(!i){ ans++; pos = XD[i].first; } else{ if(pos+INS < XD[i].second){ ans++ ; pos = XD[i].first; } } } printf("%d",ans); } return 0; }