贪心
注意:
1.数据类型
2.输入的海岛,按照横坐标排序。求出对于每个海岛来说,其安装雷达的左右区间。贪心,雷达安装位置初始值为right[0],若下一海岛的左端点在该位置右边,则需要再安装新的雷达,若下一海岛的左端点在该位置右边,则需要看右端点。若右端点在该雷达的左边,则更新当前雷达位置为该右端点,若在该雷达的右边,则不变。
3.两组测试数据
2 5
-6 3
-3 4
2 5
-6 3
-3 5
注意:
1.数据类型
2.输入的海岛,按照横坐标排序。求出对于每个海岛来说,其安装雷达的左右区间。贪心,雷达安装位置初始值为right[0],若下一海岛的左端点在该位置右边,则需要再安装新的雷达,若下一海岛的左端点在该位置右边,则需要看右端点。若右端点在该雷达的左边,则更新当前雷达位置为该右端点,若在该雷达的右边,则不变。
3.两组测试数据
2 5
-6 3
-3 4
2 5
-6 3
-3 5
代码:
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int i,j,num,count=1;
double x[1000],y[1000],left[1000],right[1000];
double r,temp;
while(1)
{
cin>>num>>r;
if(num==0&&r==0)
break;
bool flag=false;
for(i=0;i<num;i++)
{
cin>>x[i]>>y[i];
if(y[i]>r)
flag=true;
}
//失败的情况
if(flag)
{
cout<<"Case "<<count++<<": -1"<<endl;
continue;
}
//冒泡排序 x值从小到大
for(i=0;i<num-1;i++)
for(j=0;j<num-i-1;j++)
{
if(x[j]>x[j+1])
{
temp=x[j];
x[j]=x[j+1];
x[j+1]=temp;
temp=y[j];
y[j]=y[j+1];
y[j+1]=temp;
}
}
//对于每个海岛,雷达安装位置的区间为:left[i]~right[i]
for(i=0;i<num;i++)
{
left[i]=x[i]-sqrt(r*r-y[i]*y[i]);
right[i]=x[i]+sqrt(r*r-y[i]*y[i]);
}
temp=right[0];
int radar=1;
for(i=0;i<num-1;i++)
{
if(left[i+1]>temp)
{
temp=right[i+1];
radar++;
}
else if(right[i+1]<temp)
temp=right[i+1];
}
cout<<"Case "<<count++<<": "<<radar<<endl;
}
return 0;
}