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

UVA 1615 Highway 高速公路 (区间选点)

时间:2015-08-06 01:53:34      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

题意:在一条线段上选出尽量少的点,使得和所有给出的n个点距离不超过D。

分别计算出每个点在线段的满足条件的区间,然后就转化成了区间选点的问题了,按照右端点排序,相同时按照左端点排序,按照之前的排序一定保证了包含这个点的区间是连续的。贪心,每次选右边的端点,维护一个当前选择点的位置,每遇到区间就判断一下并更新一下点的位置。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
struct seg
{
    double l,r;
    bool operator < (const seg& x) const{
        return r < x.r || (r == x.r && l > x.l);
    }
}S[maxn];


int main()
{
    int L,D,N;
    while(~scanf("%d%d%d",&L,&D,&N)){
        double dis = D;
        for(int i = 0; i < N; i++){
            double x,y; scanf("%lf%lf",&x,&y);
            double r = sqrt(dis*dis-y*y);
            S[i].l = x-r;
            S[i].r = x+r;
        }
        sort(S,S+N);
        double cur = -1e9;
        int ans = 0;
        for(int i = 0; i < N; i++){
            if(cur < S[i].l) {
                cur = S[i].r < L ?S[i].r : L;
                ans++;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

UVA 1615 Highway 高速公路 (区间选点)

标签:

原文地址:http://www.cnblogs.com/jerryRey/p/4706196.html

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