贪心
#include<algorithm> #include<iostream> #include<cstdio> #include<cmath> using namespace std; struct Radar { double start,end; } radar[1005]; bool cmp(Radar a,Radar b) { return a.start<b.start; } int main() { int n,d,x,y,m,num,flag; double l,r; m = 1; while(scanf("%d%d",&n,&d)) { if(!n && !d) //如果为0 break; flag = true; for(int i = 0; i < n; i++) { scanf("%d%d",&x,&y); if(y > d) flag = false; radar[i].start = x - sqrt(d * d - y * y); //勾股定理 radar[i].end = x + sqrt(d * d - y * y); //区间覆盖范围 } if(!flag) { printf("Case %d: -1\n",m++); continue; } sort(radar,radar + n,cmp); //排序 n为岛屿数目 num = 1,l = radar[0].start,r = radar[0].end;//l和r是double l为最左端的区间的左端 r为右端 for(int i = 1; i < n; i++) { if(radar[i].start >= l && radar[i].end <= r) { // 某两块区间存在包含关系 l = radar[i].start; r = radar[i].end; } else if(radar[i].start <= r && radar[i].end >= r) //某两个区间交叉 l = radar[i].start; else if(radar[i].start > r) { //两个区间没有交集 l = radar[i].start; r = radar[i].end; num++; } } printf("Case %d: %d\n",m++,num); } return 0; }
Virtual Judge POJ 1328 Radar Installation
原文:https://www.cnblogs.com/QingyuYYYYY/p/11746397.html