【习题 8-11 UVA - 1615】Highway

【链接】 我是链接,点我呀:)
【题意】

在这里输入题意

【题解】

每个村庄都有一个范围[li..ri]
只要在这个范围内放点都可以“支配”这个村庄。
则问题就等价于线段上有n个区间。
让你选择最少的点。
使得每个区间内都有一个点。

将所有的区间按右端点升序排。其次左端点升序。
然后对于第一个区间。
最优的方法就是放一个点在这个区间的最右端。
这样就能最大化地利用这个点了
放在稍微左边那么一点的话,下一个区间就可能不能包括这个点了
所以放在最右端是最好的方案了
下一个区间如果包括这个点.那么就跳过。
否则按照同样的方法,每次都放在区间的最右端就可以了。

【代码】

/*
    1.Shoud it use long long ?
    2.Have you ever test several sample(at least therr) yourself?
    3.Can you promise that the solution is right? At least,the main ideal
    4.use the puts("") or putchar() or printf and such things?
    5.init the used array or any value?
    6.use error MAX_VALUE?
    7.use scanf instead of cin/cout?
    8.whatch out the detail input require
*/
/*
    一定在这里写完思路再敲代码!!!
*/
#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int N = 1e5;

struct abc{
    double x,y;
}a[N+10];

double l,d;
int n;

double sqr(double x){
    return x*x;
}

bool cmp(abc a,abc b){
    if ( abs(a.y-b.y)<1e-6)
        return a.x<b.x;
    else return a.y<b.y;
}

int main(){
    #ifdef LOCAL_DEFINE
        freopen("rush_in.txt", "r", stdin);
    #endif
    ios::sync_with_stdio(0),cin.tie(0);
    while (cin >> l){
        cin >> d;
        cin >> n;
        for (int i = 1;i <= n;i++){
            double x,y;
            cin >> x >> y;
            double delta = sqrt(sqr(d)-sqr(y));
            a[i].x = max(0.0,x-delta);
            a[i].y = min(l,x+delta);
        }
        sort(a+1,a+1+n,cmp);
        double now = a[1].y;
        int num = 1;
        for (int i = 2;i<= n;i++){
            if (a[i].x<=now && now<=a[i].y){
                continue;
            }else {
                num++;
                now = a[i].y;
            }
        }
        cout <<num<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/AWCXV/p/8260951.html

时间: 2024-08-09 06:38:53

【习题 8-11 UVA - 1615】Highway的相关文章

UVA - 1615 Highway(高速公路)(贪心+区间选点)

题意:给定平面上n(n<=105)个点和一个值D,要求在x轴上选出尽量少的点,使得对于给定的每个点,都有一个选出的点离它的欧几里德距离不超过D. 分析: 1.根据D可以算出每个点在x轴上的可选区域,计算出区域的左右端点. 2.贪心选点,每次都选这个区域的最右端点,这样此端点可存在于尽可能多的区域. #pragma comment(linker, "/STACK:102400000, 102400000") #include<cstdio> #include<cs

UVa 1615 Highway (贪心,区间选点问题)

题意:给定一个数 n 个点,和一个d,要求在x轴上选出尽量少的点,使得对于给定的每个点,都有一个选出的点离它的欧几里德距离不超过d. 析:首先这是一个贪心的题目,并且是区间选点问题,什么是区间选点呢,就是说在数轴上有 n 个闭区间,取尽量少的点,使得每个区间都至少有一个点. 一看是不是和这个题很相似,是的,那么区间哪里来呢?自己造呗,既然说是距离不超过d,意思就是在给定的点为圆心,以 d 为半径画圆,在x轴上的区间, 那么区间不就有了么,然后这个怎么贪心呢,是这样的,把所有的区间的右端点从小到大

UVA 1615 Highway

题意: 有一条沿x轴正方向,长为L的高速公路,n个村庄,要求修建最少的公路出口数目,使得每个村庄到出口的距离不大于D. 分析: 每个村子可建出口的距离是(l-d,r+d).将所有区间按右端点排序,若需要选择,每次都选区间右端点. 代码: #include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>using namespace

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

题意:在一条线段上选出尽量少的点,使得和所有给出的n个点距离不超过D. 分别计算出每个点在线段的满足条件的区间,然后就转化成了区间选点的问题了,按照右端点排序,相同时按照左端点排序,按照之前的排序一定保证了包含这个点的区间是连续的.贪心,每次选右边的端点,维护一个当前选择点的位置,每遇到区间就判断一下并更新一下点的位置. #include<bits/stdc++.h> using namespace std; const int maxn = 1e5+5; struct seg { doubl

UVA - 1615 Highway 区间覆盖

题目大意:在平面上有n个点和一个值D,要求再长度为L的x轴上选出尽量少的点,使得对于给定的每个点,都有一个选出的点离它的欧几里德距离不超过D 解题思路:算出每个点的区间范围.区间的重叠部分由几个区间构成就有几个点满足要求. #include<cstdio> #include<algorithm> #include<cmath> #define maxn 100010 using namespace std; double L, D; int n; struct vill

C++ Primer 第四版课后练习解答 习题1.11

注意:本随笔是直接参考<C++Primer(第四版)习题解答(完整版)>中的.此处主要是便于本人以后反复阅读. 习题1.11 用while 循环编程,输出10 到0递减的自然数.然后用for 循环重写该程序. [解答] 用while循环编写的程序: 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 int i = 10; 7 while (i >= 0) 8 { 9 cout <<

问题 1021: C语言程序设计教程(第三版)课后习题6.11

/******************************************************************** @file Main.cpp @date 2017-5-18 09:28:39 @author Zoro_Tiger @brief 问题 1021: C语言程序设计教程(第三版)课后习题6.11 http://www.dotcpp.com/oj/problem1021.html ****************************************

【uva 1615】Highway(算法效率--贪心 区间选点问题)

题意:给定平面上N个点和一个值D,要求在x轴上选出尽量少的点,使得对于给定的每个店,都有一个选出的点离它的欧几里德距离不超过D. 解法:先把问题转换成模型,把对平面的点满足条件的点在x轴的直线上可得到一个个区间,这样就是选最小的点覆盖所有的区间的问题了.我之前的一篇博文有较详细的解释:关于贪心算法的经典问题(算法效率 or 动态规划).代码实现我先空着.挖坑~

[詹兴致矩阵论习题参考解答]习题3.11

11. (Ky Fan) 对于 $A\in M_n$, 记 $\Re A=(A+A^*)/2$. 证明: $$\bex \Re \lm(A)\prec \lm(\Re A), \eex$$ 其中 $\lm(A)$ 表示 $A$ 的特征值作成的向量, $\Re\lm(A)$ 表取 $A$ 的特征值的实部所得向量. 证明: (1). 先证明对 Hermite 阵 $H$, 若它的特征值为 $$\bex \lm_1\geq \cdots\geq \lm_n, \eex$$ 则 $$\bex \sum_