博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu6097 Mindis(几何)
阅读量:6773 次
发布时间:2019-06-26

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

题解:

这里是用解析解的做法,

我们发现如果以P和Q做椭圆,那么当椭圆与圆相切的时候,答案最优

那么方程就是这样的

 

联立之后,解delta等于0,可以得到

答案就是2a了

注意不一定任何情况都有解,当delta等于0时,不一定存在那个点,这个时候显然就为中垂线与圆的交点,特判一下即可

此外点重合也要特判!

#include 
#include
#include
using namespace std;int T;struct point{ double x, y; point() { x = y = 0;} point(double _x, double _y):x(_x), y(_y) { }}p[3];const double eps = 1e-8;double dis(point A, point B){ return sqrt(pow(A.x - B.x, 2)+pow(A.y - B.y, 2));}double r, c, t, a;int main(){ cin>>T; while(T--){ scanf("%lf%lf%lf%lf%lf",&r,&p[1].x,&p[1].y,&p[2].x,&p[2].y); c = dis(p[1], p[2])/2; t = sqrt(pow(dis(p[1], p[0]), 2) - c*c); a = r*c/sqrt(t*t+c*c); if(abs(c) < eps){ point C = point(c, 0); point D = point(0, -r+t); printf("%.10f\n", 2*dis(C, D)); continue; } if(abs(a - c) < eps) { printf("%.10f\n", 2*a); continue; } double B = 2*t*(a*a-c*c); double A = c*c; double Y = -B/A/2; if((Y-t)*(Y-t) - r*r > eps){ point C = point(c, 0); point D = point(0, -r+t); printf("%.10f\n", 2*dis(C, D)); } else { printf("%.10f\n", 2*a); } }}

 

转载于:https://www.cnblogs.com/Saurus/p/7374662.html

你可能感兴趣的文章
Nexus6p:正在下载系统更新,没有进度
查看>>
【JSP手记】--jsp里面session.getAttribute("×××")在java中的表示
查看>>
PhoneGap1.3基于Android平台的搭建
查看>>
终端下使用Emacs的一些Tips
查看>>
BZOJ2082 : [Poi2010]Divine divisor
查看>>
『TensorFlow』第二弹_线性拟合&神经网络拟合_恰是故人归
查看>>
sublime 插件配置与说明
查看>>
站点开发和企业级开发有什么差别?
查看>>
JSON-RPC for python ¶
查看>>
Oracle 数据库11g新特性之高效 PL/SQL 编码
查看>>
Failed to initialize monitor Thread: Unable to establish loopback connection解决方法
查看>>
面试官自述:面向高级开发人员的iOS面试问题
查看>>
全球前四,Gartner点评阿里云云存储国际竞争力增长迅猛
查看>>
“你敢扫,我敢赔”的支付宝遇到瓶颈了,有钱竟然没处花
查看>>
马云走进俄罗斯最牛大学,校长表白:要与阿里共建科学研究所!
查看>>
无现金社会来临,未来你的孩子只能在淘宝上看到这些东西
查看>>
好大胆!犯罪分子伪造“最高人民检察院”官网,窃取用户信息
查看>>
里程碑:IBM将20量子位量子计算机作为一项云服务来提供!
查看>>
大连地区首趟务工人员“回家专列”启程
查看>>
刘国梁:有信心在东京打出好成绩,继续为国争光
查看>>