习题8-11 UVA - 1615 Highway 高速公路 (区间枚举)

大体题意:

告诉你n 个点的坐标,求在x轴上至少找多少个点能够满足 至少存在一个点到那n 个点的距离小于等于D。

思路:

比较简单的题目,没想到1Y 了。

n 个点的坐标相当于告诉你了圆心,D就是半径,构造一个圆,在x轴的两个交点分别作为区间的左端点和右端点。

然后把n 个区间按照右端点排序,当下一个区间的左端点l 大于 这个区间的r 时,就改ans++ 新加一个点。否则不加,继续枚举!

因为没告诉你数据范围,一般这样数据范围比较小,随便写写就可以了!


详细见代码:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10000 + 10;
const double eps = 1e-8;
struct Node {
    double l,r;
    bool operator < (const Node & rhs) const {
        return r < rhs.r;
    }
}p[maxn];
int main(){
    int l,d;
    while(scanf("%d",&l) == 1){
        scanf("%d",&d);
        int n;
        scanf("%d",&n);
        for (int i = 0; i < n; ++i){
            double x,y;
            scanf("%lf %lf",&x,&y);
            double l = x-sqrt(d*d-y*y);
            double r = x+sqrt(d*d-y*y);
            p[i].l = l; p[i].r = r;
        }
        sort(p,p+n);
        int ans = 1,cur = p[0].r;
        for (int i = 1; i < n; ++i){
            if (p[i].l - cur > eps){
                ++ans;
                cur = p[i].r;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值