码迷,mamicode.com
首页 > 其他好文 > 详细

UVA - 1615 Highway 区间覆盖

时间:2015-05-05 19:44:00      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:在平面上有n个点和一个值D,要求再长度为L的x轴上选出尽量少的点,使得对于给定的每个点,都有一个选出的点离它的欧几里德距离不超过D

解题思路:算出每个点的区间范围。区间的重叠部分由几个区间构成就有几个点满足要求。

#include<cstdio>
#include<algorithm>
#include<cmath>
#define maxn 100010
using namespace std;
double L, D;
int n;
struct villages{
    double l, r;
}vill[maxn];

bool cmp(const villages a, const villages b) {
    if(a.r == b.r)
        return a.l < b.l;
    else
        return a.r < b.r;
}

int main() {
    while(scanf("%lf%lf", &L, &D) == 2) {
        scanf("%d", &n);
        double x, y, len;
        for(int i = 0; i < n; i++) {
            scanf("%lf%lf", &x, &y);
            len = sqrt(D * D - y * y);
            vill[i].l = max(x - len,0.0);
            vill[i].r = min(L,x + len); 
        }
        sort(vill, vill + n, cmp);
        int ans = 1;
        double r = vill[0].r;
        for(int i = 1; i < n; i++)
            if(r >= vill[i].l && r <= vill[i].r) 
                continue;
            else{
                ans++;
                r = vill[i].r;
            }
        printf("%d\n", ans);
    }
    return 0;
}

UVA - 1615 Highway 区间覆盖

标签:

原文地址:http://blog.csdn.net/l123012013048/article/details/45504761

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!