POJ原址:POJ1328
这道题没明白哪里有贪心,当然贪心到底是什么也还没弄明白,反正看别人的看懂了,也学会了一些东西。
收获:
1.结构体的运用更清楚了,点类的坐标用成结构体很方便。
2.operator < 这个好像很牛,可是还不知道到底怎么牛。
3.fabs跟abs
4.结构体可以直接当成一个,不论是结构体变量还是结构体数组。
还要感谢大神提供的测试数据,自己自以为是的把参考程序改了一点,就WA了,用过测试数据就改好了:测试数据
参考链接:
【poj】1328 Radar Installation 快排+贪婪-angrad-ChinaUnix博客
这个链接主要参考了前面的叙述,讲的很明白。
poj1328 - Daze - 博客频道 - CSDN.NET
这个参考的程序,画的图也很有助于理解,跟上一个的叙述连起来看就很好懂了。
程序:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct point
{
double left,right;//点类,记录坐标
}p[2000],temp;
bool operator < (point a,point b)
{
return a.left<b.left;//比较两个结构体数组,重载成比较两个坐标的横坐标
}
int main()
{
int n,i,j,num=0;//num计数case,count计数可探测个数
double d;
cin>>n>>d;
while(n||d)
{
bool flag=true;
for(i=0;i<n;i++)
{
double a,b;
cin>>a>>b;
if(fabs(b)>d)//可见abs是取绝对值后再取整,而fabs是取绝对值
flag=false;//false表示没有被探测到
else
{
p[i].left=a-sqrt(d*d-b*b);
p[i].right=a+sqrt(d*d-b*b);
}
}
num++;
cout<<"Case "<<num<<": ";
if(flag==false)
cout<<-1<<endl;
else
{
int count=1;
sort(p,p+n);//才懂得结构体可以直接当成一个
temp=p[0];//temp是cur,p[i]是next
for(i=1;i<n;i++)
{
if(p[i].left>temp.right)
{
count++;
temp=p[i];
}
else if (p[i].right<temp.right)
{
temp=p[i];
}
}
cout<<count<<endl;
}
cin>>n>>d;
}
return 0;
}