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\)的最大公共 ...
随机推荐
- 【内部】Fiddler设置代理请求的方式
1.2 打开Fiiddler,设置如图步骤: 3.添加规则: 4.这里选择第三个选项: 5.选中^开始,空格结束的如图内容.复制你要代理的地址.如:http://wap.cmread.com/nap/ ...
- 在Opencv中将一幅图像均分成M* N个小图像
std::vector<std::vector<Mat> > partitionImage(Mat&src,int rows,int cols) 函数中有三个输入参数, ...
- Python学习之进程
8.2 进程 8.2.1 进程的创建 开启多进程scoketserver:server.client 进程的开启:python中的多线程,一定是有一个主进程,由主进程创建几个子进程, Linux与Wi ...
- PMP项目正常估算时间
最佳时间段+正常时间段*+最差时间段)/=正常估算时间. 项目经理小李对某活动工期进行估算时,发现人员的熟练程度和设备供应是否及时对工期至关重要.如果形成最有利组合时,预计17天可以完成:如果形成最不 ...
- Springg MVC 中文乱码处理
1.对于post请求的处理方式,在web.xml添加拦截器 <filter> <filter-name>CharacterEncodingFilter</filter-n ...
- 不要64 数位DP
Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来 ...
- java按值传递?
原文链接:https://blog.csdn.net/scholar_man/article/details/80900212 在Java中,参数都是按值传递的.被传递到方法中的拷贝值,要不就是一个引 ...
- fiddler 不能抓包解决
早上使用金山毒霸扫描了一遍电脑,然后打开fiddler后,出现了一个提示(当时没有注意看),直接点了确定,导致结果是不能抓包了,百度了很多方法,最后直接卸载金山毒霸,然后将防火墙还原为默认设置(风险不 ...
- 抖音很火的存钱计划,让python告诉你总共可以存到多少钱!
抖音上有个很火的存钱计划,说是第一天存1块钱,第二天存2块钱,第三天存3块钱.....依此类推存365天,总共可以存到多少钱,我们现在用python告诉你怎么做: #定个初始存入金额 money = ...
- css中新增的属性calc()可以计算使用
什么是calc: calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能,用来指定元素的长度.可以使用calc()给元素的border.margin.pading.font-s ...