uva 10794

来源:互联网 发布:笔记本硬盘坏了数据恢复 编辑:程序博客网 时间:2024/06/05 05:29

题意:在三维空间内有两架飞机在沿直线飞行,给出两架飞机初始位置和经过T秒后的位置,问从初始位置开始后两架飞机的最近距离。
题解:因为两架飞机飞直线,所以距离差是凸性的,可以用三分来枚举时间计算距离差找到最优解。

#include <cstdio>#include <cmath>#include <algorithm>using namespace std;const double eps = 1e-9;const double PI = acos(-1);struct Point3 {    double x, y, z;    Point3(double x = 0, double y = 0, double z = 0):x(x), y(y), z(z) {}};typedef Point3 Vector3;int dcmp(double x) {    if (fabs(x) < eps)        return 0;    return x < 0 ? -1 : 1;}Vector3 operator + (Vector3 A, Vector3 B) { return Vector3(A.x + B.x, A.y + B.y, A.z + B.z); }Vector3 operator - (Vector3 A, Vector3 B) { return Vector3(A.x - B.x, A.y - B.y, A.z - B.z); }Vector3 operator * (Vector3 A, double b) { return Vector3(A.x * b, A.y * b, A.z * b); }Vector3 operator / (Vector3 A, double b) { return Vector3(A.x / b, A.y / b, A.z / b); }bool operator == (Vector3 A, Vector3 B) { return dcmp(A.x - B.x) == 0 && dcmp(A.y - B.y) == 0; }double Dot (Vector3 A, Vector3 B) { return A.x * B.x + A.y * B.y + A.z * B.z; }double Length(Vector3 A) { return sqrt(Dot(A, A)); }double Angle(Vector3 A, Vector3 B) { return acos(Dot(A, B) / Length(A) / Length(B)); }double torad(double deg) { return deg / 180.0 * PI; }Vector3 Cross(Vector3 A, Vector3 B) { return Vector3(A.y * B.z - A.z * B.y, A.z * B.x - A.x * B.z, A.x * B.y - A.y * B.x); }double T;Point3 s1, s2, e1, e2;double dist(double t) {    Vector3 v1 = s1 + (e1 - s1) / T * t;    Vector3 v2 = s2 + (e2 - s2) / T * t;    return Length(v1 - v2);}int main() {    int t, cas = 1;    scanf("%d", &t);    while (t--) {        scanf("%lf", &T);        scanf("%lf%lf%lf%lf%lf%lf", &s1.x, &s1.y, &s1.z, &e1.x, &e1.y, &e1.z);        scanf("%lf%lf%lf%lf%lf%lf", &s2.x, &s2.y, &s2.z, &e2.x, &e2.y, &e2.z);        double l = 0, r = 1e9;        while (dcmp(r - l) > 0) {            double mid = (l + r) * 0.5;            double mid2 = (mid + r) * 0.5;            if (dist(mid) < dist(mid2))                r = mid2;            else                l = mid;        }        printf("Case %d: %.4lf\n", cas++, dist(l));    }    return 0;}
0 0