• 2017校赛 问题 F: 懒人得多动脑


    题目描述

    小D的家A和学校B都恰好在以点F为焦点的双曲线上,而小D每日所需的生活水源在一条平行该双曲线准线的直线上,设它的值为v。大家都知道,每天都是要喝水的,但是小D有点懒,他希望自己能在去上学或者回家的时候顺路打桶水,并且走最短的路,你能帮助他吗?

    下图所示样例的情况,已知焦点在x轴上,那么其准线垂直x轴,即x=v,故可作出河流所在直线如图,那么最优路线为从家A到点C(0,5.8888889)取水,然后再到学校B,那么总长度就是这两段各自距离之和,即|AC| + |CB|。

    输入

    第一行输入数据组数T(T <= 100)。

    每组数据包括四个坐标,其格式如下:

    第一行输入点A的坐标X1,Y1

    第二行输入点B的坐标X2,Y2

    第三行输入点F的坐标X3,Y3

    第四行输入值v

    保证双曲线焦点在坐标轴上,

    保证A,B点的坐标以及v值均为整数且绝对值不大于1000,保证F坐标值不超过1000.0。

    相邻两组数据之间有一空行。

    输出

    输出”Case #x: s”,x表示数据组数,s表示该最短路的距离,保留6位小数

    样例输入

    2
    40 40
    -920 480
    0.000000 73.9889111581
    636
    
    5 7
    4 5
    4.9286577 0
    0 
    

    样例输出

    Case #1: 1219.468737
    Case #2: 9.219544
    

    提示

    双曲线的定义:平面内到两定点的距离差的绝对值为定长的点的轨迹叫做双曲线。
    若设焦点为F1,F2,则双曲线上任意一点P满足 | |PF1| - |PF2| | = 2*a。
    若焦点在 x轴,则对应双曲线方程为x^2/a^2 - y^2/b^2 = 1,焦点F坐标为(c,0),其中c为a^2 + b^2,其准线为x = ±a^2/c
    若焦点在 y轴,则对应双曲线方程为y^2/a^2 - x^2/b^2 = 1,焦点F坐标为(0,c),其中c为a^2 + b^2,其准线为y = ±a^2/c
    上述a为双曲线的实半轴,b为双曲线的虚半轴。

    不想说话了,校赛好失败,本来看这道题着,以为麻烦并且还记着前两到没A的题所以没做,其实也很水啊。

    在同一侧就算对称点,否则直接算两点距离啊!

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 const int maxn=210;
     8  
     9 int main()
    10 {
    11     int T,n;
    12     cin>>T;
    13     for(int cas=1;cas<=T;cas++)
    14     {
    15         double x1,y1,x2,y2,x3,y3,v;
    16         scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
    17         scanf("%lf%lf%lf",&x3,&y3,&v);
    18         double ans;
    19         double tmax=-1e7,tmin=1e7;
    20         if((fabs(y3)<1e-6))
    21         {
    22             tmax=max(x1,x2);
    23             tmin=min(x1,x2);
    24             if(tmin>v||tmax<v)
    25                 x1=2*v-x1;
    26             ans=fabs(x1-x2)*fabs(x1-x2)+fabs(y1-y2)*fabs(y1-y2);
    27                 ans=sqrt(ans);
    28         }else{
    29             tmax=max(y1,y2);
    30             tmin=min(y1,y2);
    31             if(tmin>v||tmax<v)
    32                 y1=2*v-y1;
    33             ans=fabs(x1-x2)*fabs(x1-x2)+fabs(y1-y2)*fabs(y1-y2);
    34                 ans=sqrt(ans);
    35         }
    36         printf("Case #%d: %.6lf
    ",cas,ans);
    37     }
    38     return 0;
    39 }
  • 相关阅读:
    shift and/or 算法
    FFT求解字符串匹配
    hdu 6981/ 2021“MINIEYE杯”中国大学生算法设计超级联赛(3)1009 Rise in Price(剪枝,dp合并)
    Rancher监控指标一文干到底(workload metrics)
    RocketMQ详解(二)启动运行原理
    新人如何快速剖析源码
    RocketMQ详解(三)核心设计原理(待完善)
    windows powershell下载文件的4种方式
    windows 调用bat脚本时pause处理
    python3 中的b''解析
  • 原文地址:https://www.cnblogs.com/zxhyxiao/p/8059124.html
Copyright © 2020-2023  润新知