原题: http://poj.org/problem?id=1328
//经典区间覆盖问题
#include<iostream>
#include<cstdio>
#include<math.h>
#include<algorithm>
using namespace std;
struct range
{
double x;
double y;
}r[1001];
int cmp(range a,range b)
{
return a.x<b.x;
}
int main()
{
int n,d;
int c=0;
scanf("%d %d",&n,&d);
while(n!=0||d!=0)
{
c++;
int i;
double x,y;
int count=1;
for(i=0;i<n;i++)
{
scanf("%lf %lf",&x,&y);
if(y>d){
count=-1;
}
r[i].x=x-sqrt(d*d-y*y);
r[i].y=x+sqrt(d*d-y*y);
}
sort(r,r+n,cmp);
if(count!=-1){
double s=r[0].y;
for(i=1;i<n;i++)
{
if(r[i].x>s)
{
count++;
s=r[i].y;
}
if(r[i].x<s&&r[i].y<s)
{
s=r[i].y;
}
}
}
printf("Case %d: %d\n",c,count);
scanf("%d %d",&n,&d);
}
} //AC
本文通过一个具体的POJ题目实例,介绍了如何解决经典的区间覆盖问题。利用C++实现了一个算法,该算法首先读取输入数据,包括圆的数量和半径,并计算每个圆对应的区间的起点和终点坐标,然后按区间起始位置排序并遍历区间,记录所需的最小覆盖数量。
4687

被折叠的 条评论
为什么被折叠?



