前言
这个题目就是考了区间选点问题,检查到了我的一个漏洞,浮点运算的时候会出现浮点差。
用个这个函数比较即可
const double eps = 1e-4;
double dcmp(double x)
{
if (fabs(x) < eps) return 0;
return x < 0 ? -1 : 1;
}
题目提交处
思路
以村庄的点画圆,记录与x轴形成的区间,然后这个题目就转化成了区间选点问题。
代码
#include<bits/stdc++.h>
using namespace std;
double l, d;
int k;
const double eps = 1e-4;
double dcmp(double x)
{
if (fabs(x) < eps) return 0;
return x < 0 ? -1 : 1;
}
struct Pos
{
double x, y;
bool operator < (Pos a) const
{
double yd = dcmp(y - a.y);
return yd < 0 || (yd == 0 && dcmp(x - a.x) > 0);
}
};
set<Pos> all;
int main()
{
while (scanf("%lf%lf%d", &l, &d, &k) == 3)
{
all.clear();
_for(i, 0, k)
{
double a, b;
scanf("%lf%lf", &a, &b);
double x = sqrt(d * d - b * b);
double x1 = -x + a, x2 = x + a;
all.insert({ x1 < 0 ? 0.0 : x1, dcmp(x2 - l) > 0 ? l : x2 });
}
int ans = 0;
double t = -1;
for (const auto& p : all) if (dcmp(p.x - t) > 0) t = p.y, ans++;
printf("%d\n", ans);
}
return 0;
}