题意:输出最小的圆的数量,使之覆盖矩形。
一个圆的覆盖范围其实就是一个矩形。详情见D_DOUBLE的图
然后就变成区间覆盖问题了。前面已经做过一题。
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
struct POINT
{
double x, y;
};
bool cmp(const POINT &a, const POINT &b)
{
return a.y > b.y;
}
POINT point[11000];
int main()
{
//freopen("input.txt", "r", stdin);
double l, w, r, start, cen;
int i, j, cnt, n;
bool flag;
while (~scanf("%d%lf%lf", &n, &l, &w))
{
start = cnt = 0;
flag = false;
for (i = 0; i < n; i++)
{
scanf("%lf%lf", &cen, &r);
double rr = sqrt(r * r - w * w / 4);
point[i].x = cen - rr, point[i].y = cen + rr;
}
sort(point, point + n, cmp);
while (start < l)
{
for (i = 0; i < n; i++)
{
if (point[i].y > start && point[i].x <= start)
{
start = point[i].y;
cnt++;
break;
}
}
if (i == n)
{
flag = true;
break;
}
}
if (flag)
printf("-1\n");
else
printf("%d\n", cnt);
}
return 0;
}