博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【HIHOCODER 1142】 三分·三分求极值
阅读量:5806 次
发布时间:2019-06-18

本文共 1307 字,大约阅读时间需要 4 分钟。

描述


这一次我们就简单一点了,题目在此:

在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求点P到抛物线的最短距离d。

输入


第1行:5个整数a,b,c,x,y。前三个数构成抛物线的参数,后两个数x,y表示P点坐标。-200≤a,b,c,x,y≤200

输出

第1行:1个实数d,保留3位小数(四舍五入)

样例输入

2 8 2 -2 6

样例输出

2.437

题解

抛物线和点之间的距离可以简单的用直线公式计算:

\(d = min{sqrt((X - x)^2+(aX^2+bX+c-y)^2)}\)
直接看这个公式,完全不知道它是否为凸函数。
可以考虑选择抛物线极值点\((-\frac{b}{2a},\frac{4ac-b^2}{4a})\)
这个点将这个抛物线分成两个单调曲线,这两个曲线与某个固定点的距离函数是凸函数。
即用三分解决

#include 
#define ll long long#define inf 1000000000#define PI acos(-1)#define bug puts("here")#define REP(i,x,n) for(int i=x;i<=n;i++)#define DEP(i,n,x) for(int i=n;i>=x;i--)#define mem(a,x) memset(a,x,sizeof(a))using namespace std;inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}const double eps=1e-6;int a,b,c,x,y;double check(double tx){ double ty=a*tx*tx+b*tx+c; double t=(tx-x)*(tx-x)+(ty-y)*(ty-y); return sqrt(t);}int main(){ // while(1) { a=read(),b=read(),c=read(),x=read(),y=read(); double l=-200,r=-b/(2*a),ans; while(fabs(l-r)>eps){ double h=(r-l)/3; if(check(l+h)
eps){ double h=(r-l)/3; if(check(l+h)

转载于:https://www.cnblogs.com/zsyacm666666/p/7911559.html

你可能感兴趣的文章
11.排序算法_6_归并排序
查看>>
Redis redis-cli 命令列表
查看>>
.NET框架设计—常被忽视的框架设计技巧
查看>>
BigDecimal 舍入模式(Rounding mode)介绍
查看>>
开源 免费 java CMS - FreeCMS1.2-标签 infoSign
查看>>
开源 免费 java CMS - FreeCMS1.9 移动APP生成栏目列表数据
查看>>
git reset 三种用法总结
查看>>
hdfs笔记
查看>>
虚拟机新增加硬盘,不用重启读到新加的硬盘
查看>>
Java IO流详尽解析
查看>>
邮件服务系列之四基于虚拟用户的虚拟域的邮件系统(安装courier-authlib以及部分配置方法)...
查看>>
Linux VSFTP服务器
查看>>
《中国梦之声》新季开播 乐视生态“逆向造星”
查看>>
DHCP中继数据包互联网周游记
查看>>
Squid 反向代理服务器配置
查看>>
Java I/O操作
查看>>
Tomcat性能调优
查看>>
项目管理心得
查看>>
Android自学--一篇文章基本掌握所有的常用View组件
查看>>
灰度图像和彩色图像
查看>>