郑轻校赛 2127 tmk射气球 (数学)
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
11 1 1 2 20 0 0 4 4 4 203
Sample Output
1.7317.92
分析:
首先了解一下这道题的思路吧,我没问你要解决的就是求三维空间中的一点到一条直线的距离,我们为你假设空间直线为:Ax+By+Cz+D=0,空间点的坐标为(x1,y1,z1),那么点到直线的距离公式就是abs( Ax1+By1+Cz1+D)/sqrt(AA+BB+CC));
但是我们也知道这条空间直线是平行于x-0-y平面的,我们可以根据映射吧这条直线和点都映射到x-o-y平面里,求出在二维空间中的点线距离,与点线在三位空间中的z轴上的差距构成直角三角形,其斜边几位所求。
还需要注意道德一点就是,我们上面所说的都是点到直线的最短距离可以根据距离公式来求出,但是飞船的位置是抽象为一条线段,如果这个点在直线的正上方的话,这个距离无疑是最短的,但是如果没有在正上方,就要取点到线段两个端点距离中的较小值。
现在我们就要判断这个点到底有没有在这条线段的正上方,应用到三角形求余弦值的公式,如果求得的余弦值为负,该角就是一个钝角,肯定没有在正上方。
上面都是说线段的斜率存在的情况,也有可能线段的斜率压根不存在,这样的话也是要考虑点在不在线正上方,在的话就是横坐标的差值,不再的话还是点到线段两个端点距离的较小值。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
double h1,x1,y1,x2,y2; ///飞船
double x3,y3,z3,X,Y,Z;///气球
int m,t; ///询问次数,每次的时间
scanf("%d",&n);
while(n--)
{
scanf("%lf%lf%lf%lf%lf",&h1,&x1,&y1,&x2,&y2);///飞船的相关信息
scanf("%lf%lf%lf%lf%lf%lf",&x3,&y3,&z3,&X,&Y,&Z);///气球的相关信息
double c;
c=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));///抽象为飞船的两个端点间的距离,即飞船的长度
scanf("%d",&m);
while(m--)
{
scanf("%d",&t);
int x=x3+X*t; ///气球t秒的坐标
int y=y3+Y*t;
int z=z3+Z*t;
double b,a;
double s;
double k,C;
b=sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2));///气球的当前位置与飞船的左端点之间的距离
a=sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y));///起球的当前位置与飞船的右端点之间的距离
if(x2==x1)///即飞船这条线段斜率不存在的时候
{
if(y>=y1&&y<=y2)///如果当前气球的位置在这条直线的上方
s=x-x1;///距离就是横坐标的差值
else
s=min(a,b);
//printf("%lf\n",s);
}
else
{
k=(y2-y1)/(x2-x1);///飞船所在的直线的斜率
C=y1-k*x1;///飞船所在的直线的截距
double d=abs((k*x-y+C)/sqrt(k*k+1));///根据点到直线的距离公式,求得当前气球到直线的垂距
if(a*a+c*c<b*b||c*c+b*b<a*a)///应用三角形的余弦公式,得到这样的话相当于气球与飞船构成一个钝角三角形
s=min(a,b);
else
s=d;
}
printf("%.2lf\n",sqrt(s*s+(z-h1)*(z-h1)));
}
}
}
郑轻校赛 2127 tmk射气球 (数学)的更多相关文章
- 郑轻校赛题目 问题 G: 多少个0
问题 G: 多少个0 时间限制: 1 Sec 内存限制: 128 MB提交: 192 解决: 40 题目描述 一个n*n的方格,每个格子中间有一个数字是2或者5,现在从方格的左上角走到右下角,每次 ...
- 【郑轻邀请赛 A】tmk射气球
[题目链接]:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2127 [题意] [题解] 把气球和飞艇所代表的直线投影到xoy面上 设气球所在位置为 ...
- 【郑轻邀请赛 F】 Tmk吃汤饭
[题目链接]:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2132 [题意] [题解] 很容易想到用队列来模拟; 这个队列维护的是正在煮的4个人煮 ...
- BZOJ 3093: [Fdu校赛2012] A Famous Game
3093: [Fdu校赛2012] A Famous Game Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 242 Solved: 129[Subm ...
- xdoj 2020校赛复盘
平时写东西都不喜欢复盘,这肯定不是一个好习惯,感觉每次花好几个小时甚至好几天写题目然后没写出来也不去看题解是一种很蠢的行为( 花了这么久时间打校赛,虽然水平很low,数据结构也不太会用,还是记录一下自 ...
- CSUST 第15届 校赛总结
一直想记录一下自己的比赛,却感觉空间说说有点不适,思考了一番还是打算放到自己的博客园 这次比赛总体来说还是不错,签到还是稳的一批,基本前四小时都在rk1 开局切了几道签到题,然后开了一道思维gcd,正 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- SCNU省选校赛第二场B题题解
今晚的校赛又告一段落啦,终于"开斋"了! AC了两题,还算是满意的,英语还是硬伤. 来看题目吧! B. Array time limit per test 2 seconds me ...
- 2014上半年acm总结(1)(入门+校赛)
大一下学期才开始了acm,不得不说有一点迟,但是acm确实使我的生活充实了很多,,不至于像以前一样经常没事干= = 上学期的颓废使我的c语言学的渣的一笔..靠考前突击才基本掌握了语法 寒假突然醒悟, ...
随机推荐
- Kotlint集合简单总结
1.数组操作 var testArray = Array<>("s","ss")或者 = arrayOf("s","s ...
- 【beta】Scrum站立会议第3次....11.6
小组名称:nice! 组长:李权 成员:于淼 刘芳芳韩媛媛 宫丽君 项目内容:约跑app(约吧) 时间:2016.11.6 12:00——12:30 地点:传媒西楼220室 本次对beta阶段的需 ...
- Kafka及Spring Cloud Stream
安装 下载kafka http://mirrors.hust.edu.cn/apache/kafka/2.0.0/kafka_2.11-2.0.0.tgz kafka最为重要三个配置依次为:broke ...
- hadoop和spark搭建记录
因玩票需要,使用三台搭建spark(192.168.1.10,192.168.1.11,192.168.1.12),又因spark构建在hadoop之上,那么就需要先搭建hadoop.历经一个两个下午 ...
- Eclipse 保存代码时,不自动换行设置
Eclipse在保存代码时,总是自动换行.尤其是注释,换行后的注释读起来就很混乱.后来发现是在保存文件时设置了自动格式化代码的原因. 关闭自动格式代码设置: windows-->Preferen ...
- 【CF331E】Biologist(网络流,最小割)
[CF331E]Biologist(网络流,最小割) 题面 洛谷 翻译: 有一个长度为\(n\)的\(01\)串,将第\(i\)个位置变为另外一个数字的代价是\(v_i\). 有\(m\)个要求 每个 ...
- MySQL自定义函数、触发器、存储过程
存储过程 概念 存储过程,是一个数据库对象,类似一个函数. 在存储过程中可以使用SQL中的绝大部分内容,并且可以加入编程语言的特性(循环判断分支). 编写好存储过程之后,可以在客户端调用存储过程,存储 ...
- python的复制,深拷贝和浅拷贝的区别(转)
在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一般有三种方法, alist=[1,2,3,[& ...
- 洛谷P2617 Dynamic Rankings (主席树)
洛谷P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a ...
- 折腾到死:matlab7.0 安装
matlab7.0应该是2004年的东西了吧,装起来相当费劲!为什么不用更高的版本呢?其实我也想,之前安装的2013a安装包就5个多G,安装完之后就十多个G了.我习惯将软件安装到C盘,可怜我那100G ...