题意

在一个星球(是一个球体)表面有一个飞机(坐标(x1,y1,z1),原点是星球中心),在空中有一个空间站(坐标(x2,y2,z2)),所有值均小于100,现在要使飞机与空间站相遇,飞机的速度是1,空间站速度是v,v是小于等于100的整数。飞机只能沿星球表面飞,而空间站可以任意飞,当然不能进入星球内部。

【解答】

首先可以把三维图形转化为二维的,也就是飞机,空间站,原点确定的那一个平面,

为什么是含原点的平面?我们不妨把球体旋转一下,把飞机的初始位置固定在球体的最上边,空间站在球的侧边的上空,显然只有沿过原点平面的路线是最短的。

现在能确定三个参量,飞机(设为点A)的高度p,空间站(设为点B)的高度q,以及飞机原点的直线,空间站原点的直线的夹角(角AOB)

求夹角可以用点积 p*q = |p|*|q|*cos<p,q>

注意用叉积=|p|*|q|*sin<p,q>是不推荐的,因为使用asin()函数求角度时,它不可能返回大于pi/2的角度(可以联系反三角函数图像),使用acos()则不会出现这种问题。【差错了三个小时发现是跪在了这里Σ(っ °Д °;)っ 】

现在可以转化为二维图了

我们不妨设空间站在x轴上,飞机在x轴上方,因为夹角一定小于180度,所以飞机在x轴上方或者下方是等价的。我们假设在x轴上方。

这样成功转化为容易对其思考的二维图形

下面就是如何选择相遇点的问题,假设相遇在第一个A1到C点之间,那么空间站一定是先沿圆的切线BC走,再沿弧CA1走,

一开始想并不是沿弧走,而是沿折现走,比如说下边这个图

沿ACE走,显然走ABDE更要近一些(三角形一边比另外两边和要短),以此类推,还是走弧最近。

假设相遇点在A2处,那么空间站B就沿之间走到A2,飞船A就沿弧走到A2即可。

寻找相遇点可以使用二分,但发现相遇点从A到D(圆与x轴正半轴交点),花费时间可能是先见减后增的,所以需要三分找时间最小值。

三分的框架:

while (l<r)
{
m1=l+(r-l)/;
m2=r-(r-l)/;
if(find(m1)<find(m2)) r=m2;
else l=m1;
}

当然也可以二分时间,这样就可以避免三分了。

程序代码:

#include <iostream>
#include <iomanip>
#include <fstream>
#include <stdlib.h>
#include <time.h>
#include<cstring>
#include<cstdio>
#include<vector>
#include<string>
#include<algorithm>
#include <limits.h>
#include<cmath>
#include<map>
#include<queue>
#include<set>
using namespace std; typedef long long LL;
int i,j,k,n,m,x,y,T,ans,big,cas,num,len;
bool flag; double ms,sp,fl,si,m1,m2,lenp,lenq,l,r,t1,t2;
int v;
struct node
{
double x,y,z;
}p,q,s; double leng(node r)
{
return sqrt(r.x*r.x+r.y*r.y+r.z*r.z);
} double sz(double x,double y)
{
return sqrt(x*x+y*y);
} double getime(double m)
{
if (m<=ms)
{
sp=sz(lenp*sin(m),lenq-lenp*cos(m)) /v;
fl=(si-m)*lenp;
return max(sp,fl);
}else
{
fl=(si-m)*lenp;
sp=(sz(lenp*sin(ms),lenq-lenp*cos(ms)) + (m-ms)*lenp )/v;
return max(fl,sp);
}
} int main()
{
scanf("%lf%lf%lf",&p.x,&p.y,&p.z);
scanf("%lf%lf%lf",&q.x,&q.y,&q.z);
scanf("%d",&v); s.x=p.x*q.x;
s.y=p.y*q.y;
s.z=p.z*q.z; lenp=leng(p);
lenq=leng(q);
si=acos((s.x+s.y+s.z)/lenp/lenq);
ms=acos(lenp/lenq);
l=;
r=si;
while (r-l>=1e-)
{
m1=(r+*l)/;
m2=(*r+l)/;
t1=getime(m1);
t2=getime(m2); if (t1>t2) l=m1; else r=m2;
} printf("%.6lf\n",getime(l)); return ;
}

URAL 1988 - Planet Ocean Landing【几何&三分答案】的更多相关文章

  1. poj 3301 Texas Trip(几何+三分)

    Description After a day trip with his friend Dick, Harry noticed a strange pattern of tiny holes in ...

  2. hdu 2438 Turn the corner(几何+三分)

    Problem Description Mr. West bought a new car! So he is travelling around the city. One day he comes ...

  3. 【BZOJ】3203: [Sdoi2013]保护出题人(几何+三分+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3203 wa无数次QAQ,犯sb错....一是数组没有引用...二是输出转成了int(越界了sad). ...

  4. hdu3756三分基础题

    Dome of Circus Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. 【三分】light bulb(zoj3203)

    题目描述: 如图,你可以在房间里移动,灯泡的高度为H,你的身高为h,灯泡与墙的水平距离为D,求你影子的最长长度(影子长度=地上影子长度+墙上影子长度) 样例输入: 0.5 样例输出: 1.000 0. ...

  6. XMU 1125 越野车大赛 【三分】

    1125: 越野车大赛 Time Limit: 500 MS  Memory Limit: 64 MB  Special JudgeSubmit: 8  Solved: 4[Submit][Statu ...

  7. 洛谷 P3382 【模板】三分法(三分 二分)

    P3382 [模板]三分法 题目提供者HansBug 难度 普及/提高- 题目描述 如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. ...

  8. Hihocoder #1142 : 三分·三分求极值

    1142 : 三分·三分求极值 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 这一次我们就简单一点了,题目在此: 在直角坐标系中有一条抛物线y=ax^2+bx+c和一个 ...

  9. C++-HDU3400-Line belt[三分]

    将军饮马问题的升级版 二维平面中要从A到D,给出两条线段AB,CD,分别在线段AB,CD,以及空白处的速度为P,Q,R 求最少用时 由于最优位置满足“凸性”,且两条线段可以等价,所以可以采取三分答案迭 ...

随机推荐

  1. HTML Imports

    为什么需要导入? 先想想你在 web 上是如何加载不同类型的资源.对于 JS,我们有 <script src>.<link rel="stylesheet"> ...

  2. 修改Delphi工具控件的默认字体

    修改Delphi工具控件的默认字体: 注册表: Delphi 6:    HKEY_CURRENT_USER\Software\Borland\Delphi\6.0Delphi 7:    HKEY_ ...

  3. servlet单例多线程

    Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在 ...

  4. Andoir 判断软键盘是否弹出

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  5. Java位运算在程序设计中的使用:位掩码(BitMask)

    在Java中,位运算符有很多,例如与(&).非(~).或(|).异或(^).移位(<<和>>)等.这些运算符在日常编码中很少会用到. 在下面的一个例子中,会用到位掩码( ...

  6. LINUX6.3下RHCS的安装文档

    LINUX6.3下RHCS的安装及集群的配置文档 环境: 目前要给华为E6000系列的两个刀片安装RHCS,每一块刀片有两个业务网口和一个管理网口,但是看不见不物理网卡,而是连接到刀片自身携带的一个交 ...

  7. bzoj2466,poj1222

    都是简单的异或高斯消元 由于bzoj2466要求解得最小和,所以我们最后还要穷举自由元取最优解 type node=record        po,next:longint;      end; . ...

  8. c#基础语言编程-文件流操作

    引言 在System.IO 命名空间下提供了一系列的类,我们可以通过相应的类进行文件.目录.数据流的操作. 1.File类:提供用于创建.复制.删除.移动和打开文件的静态方法.File类 2.File ...

  9. winform 读取TXT文件 放在Label中 分类: WinForm 2014-07-31 09:56 310人阅读 评论(0) 收藏

    <span style="font-family: Arial, Helvetica, sans-serif;">#region 读取TXT 文件,放到Label中&l ...

  10. Microsoft office word关闭英文输入首字母大写设置

    1.概述: 在使用office word的时,经常出现输入一段不需首字母大写的英文时,通常敲击完回车时word会自动将首字母大写,需要重新将首字母修改成小写,这样操作很不方便.于是需要对这个功能进行一 ...