2017ACM暑期多校联合训练 - Team 6 1002 HDU 6097 Mindis (数学)
Problem Description
The center coordinate of the circle C is O, the coordinate of O is (0,0) , and the radius is r.
P and Q are two points not outside the circle, and PO = QO.
You need to find a point D on the circle, which makes PD+QD minimum.
Output minimum distance sum.
Input
The first line of the input gives the number of test cases T; T test cases follow.
Each case begins with one line with r : the radius of the circle C.
Next two line each line contains two integers x , y denotes the coordinate of P and Q.
Limits
T≤500000
−100≤x,y≤100
1≤r≤100
Output
For each case output one line denotes the answer.
The answer will be checked correct if its absolute or relative error doesn't exceed 10−6.
Formally, let your answer be a, and the jury's answer be b. Your answer is considered correct if |a−b|max(1,b)≤10−6.
Sample Input
4
4
4 0
0 4
4
0 3
3 0
4
0 2
2 0
4
0 1
1 0
Sample Output
5.6568543
5.6568543
5.8945030
6.7359174
题意:
给定一个圆心在坐标原点的圆以及该圆的半径,然后给出两个到该圆的圆心等长的非圆外点(点既可以在圆内,也可以在圆上),让从圆上找一点使其到两点的距离最短。
分析:
首先我们考虑两种最特殊的情况:
1.两个点共位置,这种情况也是完全满足题上给出的条件的,这样的话最短距离就是圆半径减去圆心到改点的距离,因为要看做两个点所以还得乘以2.
2.两个点在圆上,这样的话最短距离就是两点之间的距离。
考虑完这两种特殊的情况之后我么看一下一般的情况。
首先介绍一下反演点的定义:
如果圆内有一点P,过圆心做一条与P的连线,将这条线延长,使得在圆外的这条线上有一点P',与P关于该圆对称。
我们即可得出结论OP×OP'=r×r(r为该圆的半径)
然后我们就可以将求DP+DQ转换为求DP' +DQ',
现在的问题在于何种情况下这个点都是在中垂线上的这个点吗?
答案当然不是,我们通过连接两个反演点就可以发现,两个反演点的连线有可能与圆相交,相切的时候可以很简单的确定切点即为所求的点,相离也是如此,问题是相交的时候这个点应该如何确定呢?
相交的时候P、Q、P'、Q'可以构成一个等腰梯形,梯形与圆有一条腰的平分线,这条平分线就是我们要找的最短的距离,当然梯形与圆的交点不是我们要找的点,我们只是通过等量的转换将它转换过来而已。
后面在求DP'的长度的时候,应用到一些有关椭圆的知识,P’Q'就是椭圆的长轴,D到椭圆中心的连线即为短半轴,这样的话DP’即为c,可以简单的求得,最终求出答案。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
const double esp=0.000000005;
double dis(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
double r,x[2],y[2];
scanf("%lf%lf%lf%lf%lf",&r,&x[0],&y[0],&x[1],&y[1]);
double op=dis(0.0,0.0,x[0],y[0]);
if(x[0]==x[1]&&y[0]==y[1])
{
printf("%.7lf\n",2.0*(r-op));
continue;
}
if(op==r)
{
printf("%.7lf\n",dis(x[0],y[0],x[1],y[1]));
continue;
}
double o=acos((x[0]*x[1]+y[0]*y[1])/op/op)/2.0;///op与od的夹角
double d=r*r/op;///d表示的是圆心到反演点的距离
double h=d*cos(o);/// 两反演点构成的直线的距离
if(h<=r)
{
printf("%.7lf\n",2.0*r*sin(o));
continue;
}
double b=h-r,a=d*sin(o);
printf("%.7lf\n",op*sqrt(a*a+b*b)*2.0/r);
}
return 0;
}
2017ACM暑期多校联合训练 - Team 6 1002 HDU 6097 Mindis (数学)的更多相关文章
- 2017ACM暑期多校联合训练 - Team 8 1002 HDU 6134 Battlestation Operational (数论 莫比乌斯反演)
题目链接 Problem Description The Death Star, known officially as the DS-1 Orbital Battle Station, also k ...
- 2017ACM暑期多校联合训练 - Team 7 1002 HDU 6121 Build a tree (深搜+思维)
题目链接 Problem Description HazelFan wants to build a rooted tree. The tree has n nodes labeled 0 to n− ...
- 2017ACM暑期多校联合训练 - Team 1 1002 HDU 6034 Balala Power! (字符串处理)
题目链接 Problem Description Talented Mr.Tang has n strings consisting of only lower case characters. He ...
- 2017ACM暑期多校联合训练 - Team 4 1004 HDU 6070 Dirt Ratio (线段树)
题目链接 Problem Description In ACM/ICPC contest, the ''Dirt Ratio'' of a team is calculated in the foll ...
- 2017ACM暑期多校联合训练 - Team 9 1005 HDU 6165 FFF at Valentine (dfs)
题目链接 Problem Description At Valentine's eve, Shylock and Lucar were enjoying their time as any other ...
- 2017ACM暑期多校联合训练 - Team 9 1010 HDU 6170 Two strings (dp)
题目链接 Problem Description Giving two strings and you should judge if they are matched. The first stri ...
- 2017ACM暑期多校联合训练 - Team 8 1006 HDU 6138 Fleet of the Eternal Throne (字符串处理 AC自动机)
题目链接 Problem Description The Eternal Fleet was built many centuries ago before the time of Valkorion ...
- 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)
题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...
- 2017ACM暑期多校联合训练 - Team 8 1008 HDU 6140 Hybrid Crystals (模拟)
题目链接 Problem Description Kyber crystals, also called the living crystal or simply the kyber, and kno ...
随机推荐
- Scrum团队成立及《构建之法》第六、七章读后感
5.Scrum团队成立 5.1 团队名称:喳喳 团队目标:突破渣渣 团队口号:吱吱喳喳 团队照: 5.2 角色分配 产品负责人: 112冯婉莹 Scrum Master: ...
- (转)ActiveMQ的重连机制
花了一天的时间,终于搞明白了我的疑问. failover://(tcp://localhost:6168)?randomize=false&initialReconnectDelay=100& ...
- PDO笔记
<?php/* * 查询操作主要是PDO::query().PDO::exec().PDO::prepare().PDO::query()主要是用于有记录结果返回的操作,特别是SELECT操作, ...
- 第191天:js---Array常用属性和方法总结
Array---常用属性和方法总结 1.Array对象构造函数 /*Array对象构造函数*/ /*组合记忆 shift unshift pop push 添加和删除 shift unshift 从数 ...
- HDU4466_Triangle
今天比赛做的一个题目,不过今天终于感受到了复旦题目有多坑了. 题目的意思是给你一段长为n个单位长度的直线,你可以选择任意连续单位长度的线段组成三角形,可以组成任意你可以组成任意多个三角形,且要求其中所 ...
- luogu 1066 引水入城(bfs+贪心)
90分,有一个点TLE.... 首先可以证明一个东西,如果从上面一排的某个点bfs一次到最下面一排的饮水点不是一个区间的话,那么最后一定所有饮水点不会被覆盖完的. 证明考虑反证法. 所以从上面一排的每 ...
- P1407 [国家集训队]稳定婚姻
题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的姗姗和男友谈恋爱半年就结婚,结婚不到 ...
- 同时装了Python3和Python2,怎么用pip?
问题:同时装了Python3和Python2,怎么用pip? Ubuntu13.04, 系统内同时装了Python3.3 和 2.7 用sudo apt-get install python-pip ...
- C++堆和栈详解(转)
一.预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其 操 ...
- web项目引用tomcat中的jar
web项目引用tomcat中的jar https://blog.csdn.net/zjsdrs/article/details/77868827 如下图所示