2018年中南大学机试题a题

2018年中南大学机试题a题

题目链接

题目描述

小王和小明是好朋友,两人最开始各有一个初始位置 p 和一个恒定速度 v,从0时刻起开始,他们从初始位置以恒定速度开始行走,请告诉我行走过程中两人的最短距离是多少。

输入

一行输入T代表测试样例数目。
对于每个样例,

第一行包含四个整数 x1,y1,x2,y2,表示人的起点(x1,y1),(x2,y2)。

第二行是四个整数u1,v1,u2,v2,表示人的初始速度(u1,v1),(u2,v2)(分别为x轴和y轴方向的分速度)。

T <= 1000 , x1,y1,x2,y2,u1,v1,u2,v2的绝对值不大于1000。

输出

对于每个样例,输出一行。“Case i: d”。i 代表案例编号,d代表答案,四舍五入到小数点后6位。

样例输入

5
1 1 2 2
1 1 2 2

1 1 2 2
1 1 -1 -1

1 1 2 2
0 1 0 -1

1 1 1 1
1 1 2 2

0 0 0 1
0 1 1 0

样例输出

Case 1: 1.414214
Case 2: 0.000000
Case 3: 1.000000
Case 4: 0.000000
Case 5: 0.707107

题目思路

这是道数学题,设t秒后两个点的坐标为x3, y3,和x4,y4

x3 = x1 + t * u1	y3 = y1 + t * v1
x4 = x2 + t * u2	y4 = y2 + t * v2
距离的平方为
(x4 - x3)^2 + (y4 - y3)^2
将上述x3, y3, x4, y4代入上式并化简
[(u2-u1)^2 + (v2-v1)^2]* t^2 +2*t*[(u2-u1)*(x2-x1)+(y2-y1)*(v2-v1)]+(x2-x1)^2+(y2-y1)^2
这是个一元二次函数,a * t^2 + b * t + c
a = (u2-u1)^2 + (v2-v1)^2
b = 2 *[(u2-u1)*(x2-x1)+(y2-y1)*(v2-v1)]
c = (x2-x1)^2+(y2-y1)^2
  • 第一种情况,起始两个点的坐标是相同的则最小距离就为0
  • 第二种情况,当u2=u1并且v2=v1.两个点的x和y轴的移动速度都相同,则最小距离就是他们的起始距离
  • 第三种情况,因为是一元二次函数,并且2个点的距离都不可能小于0,所以开口肯定是向上的
    • 当对称轴小于0的时候,当t>=0的函数部分是递增的,所以最小距离就是t=0的时候,即两点起始距离
    • 当对称轴大于0的时候,最小距离就是当t取-b/2a的时候

上代码

#include<stdio.h>
#include<math.h>
int main()
{
    int v1, v2, u1, u2, x1, x2, y1, y2;
    int V, X, Y, U, n;
    double ans, t,a , b, c;
    scanf("%d",&n);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
        scanf("%d %d %d %d", &u1, &v1, &u2, &v2);
        V = v2 - v1;
        U = u2 - u1;
        X = x2 - x1;
        Y = y2 - y1;
        a = U*U + V*V ;
        b = 2 * (U*X + Y*V);
        c = X*X + Y*Y;
        if(x1 == x2 && y1 == y2)
        {
            ans = 0;
            printf("Case %d: %.6lf\n", i, sqrt(ans));
            continue;
        }
        if(a != 0)
        {
            t = (b*1.0)/(2*a);
            t = -t;
            if(t < 0)   t = 0;
            ans = a * t * t + b * t + c;
            printf("Case %d: %.6lf\n", i, sqrt(ans));
        }
        else
        {
            ans = (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1);
            printf("Case %d: %.6lf\n", i, sqrt(ans));
        }

    }

    return 0;
}
发布了12 篇原创文章 · 获赞 19 · 访问量 367

猜你喜欢

转载自blog.csdn.net/Mrs_Jiangmengxia/article/details/104888084
今日推荐