第六场 hdu 6097 Mindis (几何)

http://acm.hdu.edu.cn/showproblem.php?pid=6097

题目大意:有个圆,圆内有两个点P,Q,已知PO=QO,求圆上一点D,使得PD+QD最小

解题思路:官方题解

找着题解一步步想的,代码中有详细的解释

AC代码:

 1 #include <iostream>
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 const double eps=1e-8;
 5 void work()
 6 {
 7     double r,x1,x2,y1,y2;
 8     scanf("%lf%lf%lf%lf%lf",&r,&x1,&y1,&x2,&y2);
 9     double d0=sqrt(pow(x1,2)+pow(y1,2));
10     if(fabs(d0)<eps)
11     {
12         printf("%.9lf\n",2*r);
13         return ;
14     }
15     double k=r*r/(d0*d0);//点P‘相对于点P的比值
16     double x3=x1*k,x4=x2*k,y3=y1*k,y4=y2*k,ans;//求出来点P‘和Q‘
17     double mx=(x3+x4)/2,my=(y3+y4)/2;//求出点P‘和Q‘之间的中间点
18     double d=sqrt(pow(mx,2)+pow(my,2));//求出中间点到原点之间的距离
19     if(d<=r)
20     {
21         double dist=sqrt(pow(x3-x4,2)+pow(y3-y4,2));//P‘和Q‘之间的距离
22         ans=dist*d0/r;//相似三角形求和
23     }
24     else
25     {
26         double kk=r/d;
27         double smx=mx*kk,smy=my*kk;//得到点D的x和y
28         ans=2*sqrt(pow(smx-x1,2)+pow(smy-y1,2));
29     }
30     printf("%.9lf\n",ans);
31 }
32 int main()
33 {
34     int T;
35     scanf("%d",&T);
36     while(T--) work();
37     return 0;
38 }
时间: 2024-10-18 06:51:56

第六场 hdu 6097 Mindis (几何)的相关文章

2017多校第6场 HDU 6097 Mindis 计算几何,圆的反演

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6097 题意:有一个圆心在原点的圆,给定圆的半径,给定P.Q两点坐标(PO=QO,P.Q不在圆外),取圆上一点D,求PD+QD的最小值. 解法:圆的反演. 很不幸不总是中垂线上的点取到最小值,考虑点在圆上的极端情况. 做P点关于圆的反演点P',OPD与ODP'相似,相似比是|OP| : r. Q点同理. 极小化PD+QD可以转化为极小化P'D+Q'D. 当P'Q'与圆有交点时,答案为两点距离,否则最优

多校第六场 HDU 4927 JAVA大数类

题目大意:给定一个长度为n的序列a,每次生成一个新的序列,长度为n-1,新序列b中bi=ai+1?ai,直到序列长度为1.输出最后的数. 思路:这题实在是太晕了,比赛的时候搞了四个小时,从T到WA,唉--对算组合还是不太了解啊,现在对组合算比较什么了-- import java.io.*; import java.math.*; import java.util.*; public class Main { public static void main(String[] args) { Sca

2014多校第六场 || HDU 4927 Series 1(杨辉三角组合数)

题目链接 题意 : n个数,每操作一次就变成n-1个数,最后变成一个数,输出这个数,操作是指后一个数减前一个数得到的数写下来. 思路 : 找出几个数,算得时候先不要算出来,用式子代替,例如: 1 2 3 4 5 6 (2-1) (3-2) (4-3) (5-4)(6-5) (3-2-2+1)(4-3-3+2)(5-4-4+3)(6-5-5+4) (4-3-3+2-3+2+2-1)(5-4-4+3-4+3+3-2)(6-5-5+4-5+4+4-3) (5-4-4+3-4+3+3-2-4+3+3-2

hdu 6097 Mindis(数学几何,圆心的反演点)

Mindis Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2787    Accepted Submission(s): 555Special Judge Problem Description The center coordinate of the circle C is O, the coordinate of O is (0,

HDU 6097 Mindis (计算几何)

题意:给一个圆C和圆心O,P.Q是圆上或圆内到圆心距离相等的两个点,在圆上取一点D,求|PD| + |QD|的最小值 析:首先这个题是可以用三分过的,不过也太,.... 官方题解: 很不幸不总是中垂线上的点取到最小值,考虑点在圆上的极端情况. 做P点关于圆的反演点P',OPD与ODP'相似,相似比是|OP| : r. Q点同理. 极小化PD+QD可以转化为极小化P'D+Q'D. 当P'Q'与圆有交点时,答案为两点距离,否则最优值在中垂线上取到. 时间复杂度 O(1)O(1) 也有代数做法,结论相

HDU 4923 Room and Moor (多校第六场C题) 单调栈

Problem Description PM Room defines a sequence A = {A1, A2,..., AN}, each of which is either 0 or 1. In order to beat him, programmer Moor has to construct another sequence B = {B1, B2,... , BN} of the same length, which satisfies that: Input The inp

2014多校第六场 1005 || HDU 4925 Apple Tree

题目链接 题意 : 给你一块n×m的矩阵,每一个格子可以施肥或者是种苹果,种一颗苹果可以得到一个苹果,但是如果你在一个格子上施了肥,那么所有与该格子相邻(指上下左右)的有苹果树的地方最后得到的苹果是两倍,如果(i,j)有一颗苹果树,(i-1,j)与(i,j+1)施了肥,那么苹果应该是1的两倍2,2的两倍4,最后是4个苹果,问你怎么安排苹果和施肥的格子使最后得到的苹果最多. 思路 : 画了图就可以看出来,苹果和苹果,肥与肥之间不要相邻就好了,所有的苹果之间都有施肥,所有施肥的格子都被苹果隔开了才能

【HDU】4923 Room and Moor(2014多校第六场1003)

Room and Moor Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 263    Accepted Submission(s): 73 Problem Description PM Room defines a sequence A = {A1, A2,..., AN}, each of which is either 0

2014 HDU多校弟六场J题 【模拟斗地主】

这是一道5Y的题目 有坑的地方我已在代码中注释好了 QAQ Ps:模拟题还是练的太少了,速度不够快诶 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <climits> #include <cstring> #include <cmath> #inclu