题目传送门

现在要在山上的某个部位装一盏灯,使得这座山的任何一个部位都能够被看到。

给出最小的y坐标,如图的+号处就是y坐标最小的安装灯的地方。

这个题嘛...今年省选前学姐来我们(破烂)的机房串门的时候提到了这个题qwq学姐表示十分毒瘤qwq

压了很久今天终于做了qwq

因为问题说的太模糊了233,所以我们首先需要简化一下题意。(开始在如何判断能看到灯的问题上卡了很久)

题目其实说的是:把给出的(相邻的)拐点连成直线,找到一个点的纵坐标,使这个点在所有的直线上方或恰好在直线上。

仔细考虑一下这个其实是有二分单调性的,我们便可以二分要求的纵坐标。

首先我们把所有直线的信息求出(斜率、截距,详见必修2qwq)。

然后在二分答案的判定中,我们可以确定以二分出的答案为坐标的点在各直线上的横坐标。确定横坐标的范围,若横坐标范围是个合法的区间,我们就可以判定有解。

根据必修2的学习,我们知道斜率是一个易错点(逃),判定的时候需要分类讨论斜率大于0小于0等于0的情况(等于0很重要,防止整数被0除)

因为平时一直在做整数域上的二分,所以这次(恰巧打了一下实数域上的二分),这时需要尤其注意精度问题。

实数域二分例 eps用来控制精度,通常可取为1e-8

 while(l+eps<r)
{
double mid=(l+r)/;
if(check(mid)) r=mid;
else l=mid;
}

而且在算直线信息的时候还要乘上那个1.0,在强制类型转换。

Code

 #include<cstdio>
#include<algorithm>
#include<cmath>
#include<utility> using namespace std;
const double eps=1e-; int n;
pair<int,int>p[];
struct line{
double k,b;
}li[]; bool check(double x)
{
double l=-,r=;
for(int i=;i<n;i++)
{
if(li[i].k<) l=max(l,(x-li[i].b)/li[i].k);
else if(li[i].k>) r=min(r,(x-li[i].b)/li[i].k);
else if(li[i].k==&&li[i].b>x) return ;
}
return l<=r;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d%d",&p[i].first,&p[i].second);
for(int i=;i<n;i++)
{
li[i].k=1.0*(p[i+].second-p[i].second)/(p[i+].first-p[i].first);
li[i].b=1.0*p[i].second-li[i].k*p[i].first;
}
double l=,r=;
while(l+eps<r)
{
double mid=(l+r)/;
if(check(mid)) r=mid;
else l=mid;
}
printf("%.2lf",l);
return ;
}

Luogu P1663 山【二分答案/实数域】By cellur925的更多相关文章

  1. luogu P1663 山

    题目链接 luogu P1663 山 题解 只需要求出下凸包的最低点就好了 显然是由两个斜率相反的直线相交来的 盼下最低点为直线的情况 代码 #include<cstdio> #inclu ...

  2. Luogu P4403 [BJWC2008]秦腾与教学评估【二分答案】By cellur925

    题目传送门 这道题:真·凉心出题人. 二分答案,个人感觉其实并不只适用于有明显的"最大值最小/最小值最大"条件的题目,其实也可以称它为一种"优化的暴力".这题就 ...

  3. LuoguP2115 [USACO14MAR]破坏Sabotage【二分答案】By cellur925

    本来是想找一道生成树的题做的...结果被洛咕的标签骗到了这题...结果是二分答案与生成树一点mao关系都没有.... 题目大意:给你一个序列,请你删去某一个$l~r$区间的值($2<=i< ...

  4. Luogu P1542包裹快递【实数域二分】 By cellur925

    题目传送门 题目中说:最大值最小,显然是一个二分答案嘛qwq. 我们二分的答案显然是速度,但是由于实际中每一段的速度可能不同,所以这里我们把所有段进行的速度都定为二分出的答案. 二分的步骤好说,只是c ...

  5. luogu P1462 通往奥格瑞玛的道路--spfa+二分答案

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  6. Luogu P2920 时间管理【二分答案】

    二分答案水题. (像我这么蒻的人都能十几分钟A掉) https://www.luogu.org/problemnew/show/P2920 开始时间一定在从0到min(t[i]-s[i])的一段区间上 ...

  7. BZOJ 3993 Luogu P3324 [SDOI2015]星际战争 (最大流、二分答案)

    字符串终于告一段落了! 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3993 (luogu) https://www.l ...

  8. [luogu]P1800 software_NOI导刊2010提高(06)[DP][二分答案]

    [luogu]P1800 software_NOI导刊2010提高(06) 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成m个模块, ...

  9. [luogu]P2680 运输计划[二分答案][树上差分]

    [luogu]P2680 [NOIP2015]运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n ...

随机推荐

  1. 【POJ 3292】 Semi-prime H-numbers

    [POJ 3292] Semi-prime H-numbers 打个表 题意是1 5 9 13...这样的4的n次方+1定义为H-numbers H-numbers中仅仅由1*自己这一种方式组成 即没 ...

  2. 【转载】VS工具使用——代码生成函数关系图

    小引:        在上篇文章<VS工具使用--代码图>中,我向大家介绍了我对工具"代码图"的发现和认识.真是感觉当自己的眼睛不再被蒙蔽的时候,会发现整个世界的美好. ...

  3. homebrew -v 或homebrew -doctor报错请检查 .bash_profile是否有误

    homebrew -doctor报错: /usr/local/Library/Homebrew/global.rb:109:in `split': invalid byte sequence in U ...

  4. C# 自定义控件及引用自动义控件

    1.http://www.cnblogs.com/hjxzjp/p/7823292.html   优先考虑从现有的控件中进行派生,并添加所需要的功能. 在解决方案资源管理器窗口中设置:引用----&g ...

  5. HDU2476 String painter —— 区间DP

    题目链接:https://vjudge.net/problem/HDU-2476 String painter Time Limit: 5000/2000 MS (Java/Others)    Me ...

  6. EhCache+Redis实现分布式缓存

    Ehcache集群模式 由于 EhCache 是进程中的缓存系统,一旦将应用部署在集群环境中,每一个节点维护各自的缓存数据,当某个节点对缓存数据进行更新,这些更新的数据无法在其它节点中共享,这不仅会降 ...

  7. hdu 4763 Theme Section(next数组找串中三段相等)

    题意:在一个串中找 EAEBE 的形式的最长的E,其中E为一个字符串,也就是说找到前缀与后缀相同,并且串中还存在相同的一段,它们不能重复. 思路:利用next数组,next[len]代表的即是最大的相 ...

  8. BDB c++例子,从源码编译到运行

    第一步先下载源码,解压后 ./dist/configure --enable-cxx编译,然后make, make install --enable-cxx To build the Berkeley ...

  9. CoreOS,CoreOS,一款 Linux 容器发行版

    CoreOS,一款最新的 Linux 发行版本,支持自动升级内核软件,提供各集群间配置的完全控制. 关于使用哪个版本的 Linux 服务器系统的争论,常常是以这样的话题开始的: 你是喜欢基于 Red ...

  10. Android之APP模块编译

    一,如何把app编进系统 a.源码编译,在packages/apps目录下有安卓原生的app,以Bluetooth为例,源码根目录下有Android.mk文件: packages\apps\Bluet ...