~题目链接~
http://poj.org/problem?id=1328
输入
3 2 1 2 -3 1 2 1 1 2 0 2 0 0
结果
Case 1: 2 Case 2: 1
1.小岛上的雷达在X轴上有覆盖区域,左点 x-sqrt(d*d-y*y)和 右点 x+sqrt(d*d-y*y).
2.对左覆盖点就行排序,(区域覆盖问题)。
贪心
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #define maxn 1000+10 int num=0; struct node { double l,r; } N[maxn],M; int main() { int n; double d; while(~scanf("%d%lf",&n,&d) && (n!=0 || d!=0)) { num++; int i,j,flag=0,sum=1; double x,y,f; for(i=0; i<n; i++) { scanf("%lf%lf",&x,&y); if(y<=d && y>=0) { N[i].l=x-sqrt(d*d-y*y);//左点 N[i].r=x+sqrt(d*d-y*y);//右点 } else flag=1; } if(!flag) { for(i=0; i<n-1; i++) for(j=0; j<n-i-1; j++) if(N[j].r>=N[j+1].r)//对有点进行排序 { M=N[j]; N[j]=N[j+1]; N[j+1]=M; } f=N[0].r; for(i=1; i<n; i++) { if(N[i].l>f)//如果该区域的右点大于前一个区域的右点,则无覆盖,雷达数增加 { sum++; f=N[i].r; } } printf("Case %d: %d ",num,sum); } else printf("Case %d: -1 ",num); } return 0; }
给出20组测试数据,以便测试
2 5 -3 4 -6 3 4 5 -5 3 -3 5 2 3 3 3 20 8 -20 7 -18 6 -5 8 -21 8 -15 7 -17 5 -1 5 -2 3 -9 6 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 7 9 6 10 5 0 0 2 3 0 2 2 3 2 3 0 2 1 3 3 3 1 2 -3 2 2 4 8 5 2 4 -4 4 -3 3 -3 1 -3 0 -1 0 0 5 6 0 3 0 1 2 -3 1 2 1 3 2 1 2 -3 1 2 1 1 2 0 2 2 3 0 2 2 3 4 -5 4 3 4 3 2 3 6 -9 3 -3 1 2 -3 2 2 1 6 2 1 2 1 2 1 2 -3 1 2 1 0 0 1 2 0 2 2 3 0 2 1 3 3 10 1 10 2 3 4 5 3 5 1 10 2 3 4 5 4 7 1 10 2 3 4 5 0 0 3 9 1 10 2 3 4 5 0 0 ================结果 Case 1: 1 Case 2: 2 Case 3: 4 Case 4: 1 Case 5: 1 Case 6: -1 Case 7: 3 Case 8: -1 Case 9: 2 Case 10: 1 Case 11: 1 Case 12: -1 Case 13: -1 Case 14: 2 Case 15: 1 Case 16: 1 Case 17: 1 Case 18: -1 Case 19: -1 Case 20: -1