#include<stdio.h>
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<algorithm>
using namespace std;
struct frame
{
double x;
double y;
}c[1001];
struct range
{
double l, r;
}g[1001];
bool cmp(range a, range b)
{
return a.l<b.l;
}
int main()
{
int n, d, i;
int Case = 0;
while(~scanf("%d%d", &n, &d))
{
if(n==0&&d==0)
break;
int sum = 1;
for(i=0; i<n; i++)
{
scanf("%lf%lf", &c[i].x, &c[i].y);
g[i].l = c[i].x - sqrt(d*d-c[i].y*c[i].y);
g[i].r = c[i].x + sqrt(d*d-c[i].y*c[i].y);
if(c[i].y>d|| d<=0 || c[i].y<0) sum = -1;
}
sort(g, g+n, cmp);
double m = g[0].r;
for(i=1; i<n&&sum!=-1; i++)
{
if(m < g[i].l)
{
sum++;
m = g[i].r;
}
else if(m > g[i].r)
m = g[i].r;
}
printf("Case %d: %d\n", ++Case, sum);
}
return 0;
}
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<algorithm>
using namespace std;
struct frame
{
double x;
double y;
}c[1001];
struct range
{
double l, r;
}g[1001];
bool cmp(range a, range b)
{
return a.l<b.l;
}
int main()
{
int n, d, i;
int Case = 0;
while(~scanf("%d%d", &n, &d))
{
if(n==0&&d==0)
break;
int sum = 1;
for(i=0; i<n; i++)
{
scanf("%lf%lf", &c[i].x, &c[i].y);
g[i].l = c[i].x - sqrt(d*d-c[i].y*c[i].y);
g[i].r = c[i].x + sqrt(d*d-c[i].y*c[i].y);
if(c[i].y>d|| d<=0 || c[i].y<0) sum = -1;
}
sort(g, g+n, cmp);
double m = g[0].r;
for(i=1; i<n&&sum!=-1; i++)
{
if(m < g[i].l)
{
sum++;
m = g[i].r;
}
else if(m > g[i].r)
m = g[i].r;
}
printf("Case %d: %d\n", ++Case, sum);
}
return 0;
}
本文通过C++实现了一个解决区间覆盖问题的算法。该算法首先读取一系列圆心坐标及半径,计算出每个圆在X轴上的覆盖区间,并对其进行排序。接着遍历这些区间,尽可能地使用最少数量的区间来覆盖所有区域。如果存在无法被覆盖的情况,则输出不可行。
509





