比较简单的题,直接求空间中一个点到直线的距离而已,这道题说了直线和水平的平面 平行,我们可以先求投影到直线的距离,然后再算当前点到直线的距离。

Description

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

Input

第一行一个整数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]

Output

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

Sample Input

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

Sample Output

1.73 17.92
  1 #include <iostream>
  2 #include<string>
  3 #include<cstring>
  4 #include<vector>
  5 #include<set>
  6 #include<map>
  7 #include<stack>
  8 #include<queue>
  9 #include<list>
 10 #include<cmath>
 11 #include<algorithm>
 12 #include<cstdio>
 13 #include <bitset>
 14 #include <climits>
 15 #include <time.h>
 16 #include<iomanip>
 17 #define INF 0x3f3f3f3f
 18 using namespace std;
 19 #define ll long long
 20 #define eps 1e-8
 21 #define zero(x) (((x>0)?(x):-(x))<eps)
 22 struct point{double x,y;};
 23
 24 double distancen(point p1,point p2)
 25 {
 26     return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
 27 }
 28 ll xmult(point p1,point p2,point p0)
 29 {
 30     return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
 31
 32 }
 33 point intersection(point u1,point u2,point v1,point v2)
 34 {
 35     point ret = u1;
 36     double t = ((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))
 37                 /((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
 38     ret.x+=(u2.x-u1.x)*t;
 39     ret.y+=(u2.y-u1.y)*t;
 40     return ret;
 41
 42 }
 43
 44 point ptoseg(point p,point l1,point l2)
 45 {
 46     point t = p;
 47     t.x+=l1.y-l2.y;
 48     t.y+=l2.x-l1.x;
 49
 50     if(xmult(l1,t,p)*xmult(l2,t,p)>eps)
 51     {
 52         return (distancen(p,l1)<distancen(p,l2))?l1:l2;
 53     }
 54     return intersection(p,t,l1,l2);
 55 }
 56
 57 int dot_online(point p,point l1,point l2)
 58 {
 59     return (zero(xmult(p,l1,l2))&&(l1.x-p.x)*(l2.x-p.x)==0&&(l1.y-p.y)*(l2.y-p.y)==0);
 60 }
 61
 62 int main()
 63 {
 64     //freopen("D://in.txt","r",stdin);
 65     //freopen("D://out.txt","w",stdout);
 66     int T;
 67     scanf("%d",&T);
 68     while(T--)
 69     {
 70         bool mark = false;
 71         point ll1,ll2;
 72         double h,x1,y1,x2,y2;
 73         scanf("%lf%lf%lf%lf%lf",&h,&x1,&y1,&x2,&y2);
 74         ll1.x = x1;ll1.y = y1;
 75         ll2.x = x2;ll2.y = y2;
 76         if(x1==x2&&y1==y2)
 77             mark = true;
 78
 79         double x,y,z,X,Y,Z;
 80         scanf("%lf%lf%lf%lf%lf%lf",&x,&y,&z,&X,&Y,&Z);
 81         int n;
 82         scanf("%d",&n);
 83         while(n--)
 84         {
 85             int t;
 86             scanf("%d",&t);
 87             point newp;
 88             newp.x = x+t*X;
 89             newp.y = y+t*Y;
 90             double zz = z+t*Z;
 91             if(mark)
 92             {
 93                 double res = distancen(newp,ll1);
 94                 double ans = sqrt((h-zz)*(h-zz)+res*res);
 95                 printf("%.2lf\n",ans);
 96             }
 97             else if(dot_online(newp,ll1,ll2))
 98             {
 99                 double ans = fabs(h-zz);
100                 printf("%.2lf\n",ans);
101             }
102             else
103             {
104                 point pseg = ptoseg(newp,ll1,ll2);
105                 double res = distancen(pseg,newp);
106                 double ans = sqrt(res*res+(zz-h)*(zz-h));
107                 printf("%.2lf\n",ans);
108             }
109         }
110     }
111     return 0;
112 }

转载于:https://www.cnblogs.com/bushuiqitiandi/p/6724279.html

【zzulioj 2127】 tmk射气球相关推荐

  1. zzuli 2127 tmk射气球

    经典点到线段最短距离的问题,用向量法写的 题目链接:zzuli-2127 #include<iostream> #include<cmath> using namespace ...

  2. 【zzulioj 2127 tmk射气球】+ 空间点到线段距离

    2127: tmk射气球 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 537 Solved: 97 SubmitStatusWeb Board Des ...

  3. 【郑轻邀请赛 A】tmk射气球

    [题目链接]:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2127 [题意] [题解] 把气球和飞艇所代表的直线投影到xoy面上 设气球所在位置为 ...

  4. 郑轻校赛 2127 tmk射气球 (数学)

    Description 有一天TMK在做一个飞艇环游世界,突然他发现有一个气球匀速沿直线飘过,tmk想起了他飞艇上有一把弓,他打算拿弓去射气球,为了提高射击的准确性,他首先在飞艇上找到一个离气球最近的 ...

  5. leetcode 452 射气球

    leetcode 452 题 解题思路: 将气球左边界从小到大排序,然后从一个的最右边开始射箭,直到不能扎到下一个气球的最左边为止.偷一波官方题解的图. class Solution {public ...

  6. leetcode452_用最少的箭射气球(python)

    题目: 对于每个气球,提供的输入是水平方向上,纵坐标不重要,因此只要知道开始和结束的横坐标就足够了.开始坐标总是小于结束坐标. 一支弓箭可以沿着 x 轴从不同点完全垂直地射出.  xstart ≤ x ...

  7. tmk射气球(郑州轻工业学院第九届ACM程序设计大赛)

    题目描述 有一天TMK在做一个飞艇环游世界,突然他发现有一个气球沿匀速沿直线飘过,tmk想起了他飞艇上有一把弓,他打算拿弓去射气球,为了提高射击的准确性,他首先在飞艇上找到一个离气球最近的一个点,然后 ...

  8. 用最少数量的箭引爆气球

    思路 如何使用最少的弓箭呢? 直觉上来看,貌似只射重叠最多的气球,用的弓箭一定最少,那么有没有当前重叠了三个气球,我射两个,留下一个和后面的一起射这样弓箭用的更少的情况呢? 尝试一下举反例,发现没有这 ...

  9. leetcode 452. Minimum Number of Arrows to Burst Balloons | 452. 用最少数量的箭引爆气球(左程云:最大线段重合问题)

    题目 https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/ 题解 重叠区间问题可以总结为在坐标轴上若干个位 ...

最新文章

  1. 微软撤回了开放面部识别数据集,出于法律原因
  2. poj2002 poj3432 正方形个数 (hash,二分)
  3. Android EditText属性用法
  4. 32位x86处理器架构
  5. QInputDialog Multiple Inputs 输入多个变量的对话框
  6. 毛绒材质渲染_学室内设计必进,建模渲染那都不是事儿
  7. 前端学习(2013)vue之电商管理系统电商系统之监听on-success事件
  8. 9 10次c语言上机作业答案,第十五次上机作业带答案
  9. idle点开没反应_翟天临、靳东,一个人越是没文化越是喜欢装
  10. Java 夯实基础之注解
  11. 决策树结果可视化中文乱码问题解决方案
  12. 冒泡排序图解及代码实现
  13. 淘宝APP用户行为数据分析案例——Python
  14. Android开发之so文件使用方法详解
  15. Python 批量下载SIGMOD,VLDB的论文 Mac OS
  16. 贝格尔编排法-java
  17. androidjni开发!应聘高级Android工程师历程感言,快来收藏!
  18. 双系统安装红旗linux,红旗LINUX怎么安装成双系统?
  19. android studio制作.9图片,并且不改变原图大小
  20. 系统升级: PHP(5.1.6-5.4.7) CI(1.7.2-2.1.2)调查记录

热门文章

  1. 如何在DBNet中加入新的主干网络
  2. 电子产品和计算机技术,还傻傻分不清电子产品和数码产品?看看这些就会恍然大悟...
  3. 项目实训-千寻-服务端SSH框架完善
  4. ConfigurableListableBeanFactoryBeanFactory的集大成者
  5. 【Unity Shader】(八) ------ 高级纹理之立方体纹理及光线反射、折射的实现
  6. python清洗数据去除停用词_关于regex:在Python中删除停用词的快捷方法
  7. jQuery中国省份地图悬浮层简介js特效代码
  8. 德龙X5000导航升级包下载
  9. 老毛桃U盘启动盘制作工具V20140501完美贡献版
  10. iOS VoIP电话:CallKit与PushKit的应用