Codeforces Gym 101505C : Cable Connection (计算几何)
题意:给出第一象限的N个点,存在一直线x/a+y/b=1(a>0,y>0)使得所有点都在这条直线下面,求 min{sqrt(a^2+b^2)}
显然,这样的直线必然经过这N个点中的某一个(可用反证法证得),所以先对只有一个点的情况进行分析。
当只有一个点P(x0,y0)时,易得
此时设t=a/b,可知,a^2+b^2可写成两个凹函数相加的形式,故可用三分法求解。
所以N个点的情况就可解了。容易想到,只需要考虑凸包上位于右上侧的点(满足该点的左上方右下方都有点),那么该点就有成为“关键的点”的可能,至于三分时的自变量的范围,就根据这个点的前后两个点来得到即可。
#include<bits/stdc++.h>
using namespace std; const double eps=1e-;
const double inf=2e6;
int dcmp(double x)
{
if(fabs(x)<eps) return ;
else return x<? -:;
} struct Point
{
double x,y;
Point(double x_=,double y_=)
{
x=x_,y=y_;
}
Point operator -(const Point& rhs)
{
return Point(x-rhs.x,y-rhs.y);
}
bool operator<(const Point& rhs)const
{
return x<rhs.x||x==rhs.x&&y<rhs.y;
}
};
typedef Point Vector;
double Cross(Vector A,Vector B)
{
return A.x*B.y-A.y*B.x;
}
double Area2(Point A,Point B,Point C)
{
return Cross(B-A,C-A);
}
int ConvexHull(Point *p,int n,Point *ch)
{
sort(p,p+n);
int m=;
for(int i=; i<n; i++)
{
while(m>&&dcmp(Area2(ch[m-],ch[m-],p[i]))<=) --m;
ch[m++]=p[i];
}
int k=m;
for(int i=n-; i>=; --i)
{
while(m>k&&dcmp(Area2(ch[m-],ch[m-],p[i]))<=) --m;
ch[m++]=p[i];
}
return n>? m-:m;
}
//=============================================================
const int maxn=1e6+;
Point p[maxn],ch[maxn];
double k[maxn]; double xielv(Point A,Point B)
{
if(dcmp(A.x-B.x)==) return -inf;
else return (A.y-B.y)/(A.x-B.x);
}
double cal(Point P,double P_k)
{
double a=P.x-P.y/P_k;
double b=P.y-P.x*P_k;
return sqrt(a*a+b*b);
}
double sanfen(Point P,double k1,double k2)
{
double l=k1,r=k2;
while(r-l>eps)
{
double mid=(l+r)/;
double f1=cal(P,mid);
double midmid=(mid+r)/;
double f2=cal(P,midmid);
if(f1<f2) r=midmid;
else l=mid;
}
return cal(P,l);
} int main()
{
int n,m;
while(~scanf("%d",&n))
{
double ans=inf;
double maxx=,maxy=;
for(int i=; i<n; i++) //读点
{
scanf("%lf%lf",&p[i].x,&p[i].y);
maxx=max(maxx,p[i].x),maxy=max(maxy,p[i].y);
}
p[n++]=Point(maxx,),p[n++]=Point(,maxy); //加点,便于处理
m=ConvexHull(p,n,ch); //求凸包
for(int i=; i<m; i++) k[i]=xielv(ch[i],ch[(i+)%m]); //求斜率
for(int i=; i<m; i++)
if(ch[i].x>=ch[(i+)%m].x&&ch[i].y<=ch[(i+)%m].y && ch[(i+)%m].x>=ch[(i+)%m].x&&ch[(i+)%m].y<=ch[(i+)%m].y)
ans=min(ans,sanfen(ch[(i+)%m],k[i],k[(i+)%m]));
printf("%.3lf\n",ans+eps);
}
}
Codeforces Gym 101505C : Cable Connection (计算几何)的更多相关文章
- Codeforces Gym 100338B Geometry Problem 计算几何
Problem B. Geometry ProblemTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudg ...
- check cable connection PXE-M0F: Exiting intel PXE ROM no bootable device-- insert boot disk and pre
今天修电脑遇到一个问题,新买的电脑的原装的是linux,然后我按常规方式进入PE后重装系统,然后开机一直显示下面的代码,进不去: check cable connection PXE-M0F: Exi ...
- Codeforces Gym 101252D&&floyd判圈算法学习笔记
一句话题意:x0=1,xi+1=(Axi+xi%B)%C,如果x序列中存在最早的两个相同的元素,输出第二次出现的位置,若在2e7内无解则输出-1. 题解:都不到100天就AFO了才来学这floyd判圈 ...
- Codeforces Gym 101190M Mole Tunnels - 费用流
题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\rig ...
- Codeforces Gym 101623A - 动态规划
题目传送门 传送门 题目大意 给定一个长度为$n$的序列,要求划分成最少的段数,然后将这些段排序使得新序列单调不减. 考虑将相邻的相等的数缩成一个数. 假设没有分成了$n$段,考虑最少能够减少多少划分 ...
- 【Codeforces Gym 100725K】Key Insertion
Codeforces Gym 100725K 题意:给定一个初始全0的序列,然后给\(n\)个查询,每一次调用\(Insert(L_i,i)\),其中\(Insert(L,K)\)表示在第L位插入K, ...
- Codeforces gym 101343 J.Husam and the Broken Present 2【状压dp】
2017 JUST Programming Contest 2.0 题目链接:Codeforces gym 101343 J.Husam and the Broken Present 2 J. Hu ...
- codeforces gym 100553I
codeforces gym 100553I solution 令a[i]表示位置i的船的编号 研究可以发现,应是从中间开始,往两边跳.... 于是就是一个点往两边的最长下降子序列之和减一 魔改树状数 ...
- CodeForces Gym 100213F Counterfeit Money
CodeForces Gym题目页面传送门 有\(1\)个\(n1\times m1\)的字符矩阵\(a\)和\(1\)个\(n2\times m2\)的字符矩阵\(b\),求\(a,b\)的最大公共 ...
随机推荐
- Jmeter响应数据中文乱码|响应内容显示乱码
1.使用jmeter进行接口调用时出现返回数据乱码,如图示 原因是jmeter默认按照ISO-8859-1解析响应的数据. 2.所以需要修改bin目录下的jmeter.properties文件: 具体 ...
- [开发技巧]·TopN指标计算方法
[开发技巧]·TopN指标计算方法 1.概念介绍 在图片分类的中经常可以看到Top-1,Top-5等TopN准确率(或者时错误率). 那这个TopN是什么意思呢?首先Top-1准确率最好理解,就是 ...
- mysql——查询语句——单表查询——(示例)
一.基本查询语句 select的基本语法格式如下: select 属性列表 from 表名和视图列表 [ where 条件表达式1 ] [ group by 属性名1 [ having 条件表达式2 ...
- spring boot-9.对springMVC的支持
1.thymeleaf spring boot 推荐的模板引擎是thymeleaf.spring boot 的自动配置已经默认配置好了themleaf,只要导入themleaf的Starter就可以了 ...
- [转帖]目标管理的S.M.A.R.T.理念
目标管理的S.M.A.R.T.理念 https://blog.csdn.net/gehantao/article/details/1593510 目标管理(MBO)是一种管理战略,它使用的是S ...
- jquery html select 清空保留第一项
<select id="a"> <option>1</option> <option>2</option> <op ...
- HTTPS为什么是安全的?
学习自https://www.cnblogs.com/zhangsanfeng/p/9125732.html,感谢博主 超文本传输协议HTTP被用于在web浏览器和网站服务器之间传递信息,但以明文方式 ...
- Ubuntu下火狐浏览器播放视频出现解码问题
问题描述 点击视频播放按钮,视频不会出现缓冲条,也没任何提示,视频界面就一直是黑屏的状态.右键该视频界面,选择检查元素,点击控制台,发现如下问题: The video on this page can ...
- Vuejs——slot内容分发
①概述: 简单来说,假如父组件需要在子组件内放一些DOM,那么这些DOM是显示.不显示.在哪个地方显示.如何显示,就是slot分发负责的活. ②默认情况下父组件在子组件内套的内容,是不显示的. 例如代 ...
- 6-5 如何读写excel文件
>>> import xlrd,xlwt 一.读excel 1.打开一个excel(读模式) >>> book = xlrd.open_workbook(r&quo ...