问题 : tmk射气球

时间限制: 1 Sec  内存限制: 128 MB

题目描述

有一天TMK在做一个飞艇环游世界,突然他发现有一个气球沿匀速沿直线飘过,tmk想起了他飞艇上有一把弓,他打算拿弓去射气球,为了提高射击的准确性,他首先在飞艇上找到一个离气球最近的一个点,然后射击(即使气球在飞船的正上方),现在求某些时刻飞艇上的点和气球的距离最小是多少(这个最小距离我们简称为飞艇到气球的距离)。

输入

第一行一个整数T(T<=20),表示有T组测试数据

每组测试数据,有两行。

第一行有5个整数,h,x1,y1,x2,y2,其中h表示飞船的高度,飞船可抽象为一个线段,(x1,y1)(x2,y2)分别是这个线段的端点(有可能会有(x1,y1)(x2,y2)重合的情况)

第二行有6个整数,x,y,z,X,Y,Z分别表示气球的在第0秒的时候的横坐标,纵坐标,高度,一秒时间气球横坐标的变化量,一秒时间气球纵坐标的变化量,一秒时间气球高度的变化量(如果现在气球在(x0,y0,z0)下一秒坐标就为(x0+X,y0+Y,z0+Z))

第三行1个整数n,表示询问组数

接下来的n行,每行一个整数,表示询问的秒数t

题目涉及的整数除了T以外,范围均为[0,1000]

输出

每组询问输出n行,每行输出一个数,表示在t秒的时候飞艇与气球的距离最小是多少,保留两位小数

样例输入

1
1 1 1 2 2
0 0 0 4 4 4
2
0
3

样例输出

1.73
17.92
#include <stdio.h>
#include <math.h>
int main()
{
    double h, x1, y1, x2, y2, x, y, z, vx, vy, vz, x0, y0, z0, la, lb, l, p;
    int T, t, n;
    while (~scanf("%d", &T))
    {
        while (T--)
        {
            scanf("%lf%lf%lf%lf%lf", &h, &x1, &y1, &x2, &y2);
            scanf("%lf%lf%lf%lf%lf%lf", &x0, &y0, &z0, &vx, &vy, &vz);
            scanf("%d", &n);
            while (n--)
            {
                scanf("%d", &t);
                x = x0 + vx * t;
                y = y0 + vy * t;
                z = z0 + vz * t;
                la = sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1) + (z - h) * (z - h));
                lb = sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2) + (z - h) * (z - h));
                l = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
                if (l == 0)
                {
                    printf("%.2f\n", la);
                    continue;
                }
                if (la + lb == l)
                {
                    printf("0.00\n");
                    continue;
                }
                if (la + l == lb)
                {
                    printf("%.2f\n", la);
                    continue;
                }
                if (lb + l == la)
                {
                    printf("%.2f\n", lb);
                    continue;
                }
                if (l * l + lb * lb < la * la || l * l + la * la < lb * lb)
                {
                    printf("%.2f\n", la < lb ? la : lb);
                    continue;
                }
                p = (la + lb + l) / 2;
                printf("***%.2f\n", (2 * sqrt(p * (p - la) * (p - lb) * (p - l))) / l);
            }
        }
    }
    return 0;
}

最新文章

  1. ABP源码分析二十一:Feature
  2. IOS-UIDynamic
  3. python文件调用
  4. BZOJ1097: [POI2007]旅游景点atr
  5. Boostrap学习心得
  6. jquery 父页面 子页面 同级页面 调用
  7. jdk1.7升级到jdk1.8后出错: [ERROR] javadoc: warning - Multiple sources of package comments found for package
  8. 基于AFNetworking3.0网络封装
  9. java读取xml(当xml放在包里时)
  10. android在eclipse中打包(签名包)方法及常见问题解决
  11. 在使用simplexml_load_file()函数读取xml文件时遇到&lt;![CDATA[]]&gt;,怎么让其进行解析
  12. 色彩转换——RGB &amp; HSV
  13. mpvue——另类支持v-html
  14. selenium 定位密码软键盘
  15. 在eclipse中安装groovy插件
  16. (转)vmware下给linux虚拟机扩容
  17. python+selenium十三:破解简单的图形验证码
  18. Virtualbox的centos7 nat和桥接网络配置
  19. 10.20stark组件已经完工
  20. Effective Java通用设计

热门文章

  1. 1Mybatis入门--1.1单独使用jdbc编程问题总结
  2. FLASK-----基本知识(一)
  3. Zookeeper客户端Curator基本API
  4. ActiveMQ中Broker的应用与启动方式
  5. [sklearn] 实现随即梯度下降(SGD)&amp;分类器评价参数查看
  6. Delaunay triangulation
  7. python3+selenium入门02-操作火狐浏览器
  8. BCG界面库
  9. $.each() 与 $(selector).each()的区别
  10. Centos 6.5 freeswitch 编译mod_shout