~题目链接~
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\n",num,sum);
}
else
printf("Case %d: -1\n",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