Radar Installation(POJ 1328 贪心)
~题目链接~
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
浙公网安备 33010602011771号