(HDU 5761)2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛--过河(物理-数学 - 分解)


题目描述


现在萌新要乘船度过一条河,这条河宽为s米。
现已知船相对于水的速度为v 1,水流的速度为v 2
由于萌新想到达起点的正对岸,所以他会一直调整船行驶的方向朝向正对岸。

你的任务是计算萌新将用多少时间度过这条河;若他不能到达起点的正对岸,输出“Infinity”。

输入描述:

第一行输入一个整数n,表示测试用例数;
接下来n行,每行输入三个整数s、v1、v2。
其中,1≤n≤1000,0≤s≤100, 0≤v1,v2≤100。

输出描述:

输出一个实数,你的任务是计算萌新将用多少时间度过这条河(保留10位小数);若他不能到达起点的正对岸,输出“Infinity”。
示例1

输入

3
2 2 2
2 4 3
5 6 5

输出

Infinity
1.1428571429
2.7272727273

.

将v1 , v2,分情况讨论,先将v1分解 , 我们可以看到v1sinθ与v2相抵消,那么既然船要正对着终点方向,水流方向要保持不变,可以得到公式 
1.   ʃ(v1sinθ)dt =  ʃ(v2)dt   .(两边距离相等,则刚好抵消,水平方向不动)

如果v1 < v2 绝对不可能达到 

2.  ʃ(v1 - v2sinθ)dt = s  .

两式子联立 , 有相同  ʃ(sinθ)dt 相消 ,可以得到与t有关的式子。

t = s * v1 /(v1*v1 - v2*v2) . 

下面代码:
#include <iostream>
#include<iomanip>
#include<cstdio>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        double a,v1,v2;
        scanf("%lf %lf %lf",&a,&v1,&v2);
        if(a==0)
            printf("0.0000000000\n");
        else if(v1<=v2||v1<=0)
            printf("Infinity\n");
        else
        {
            printf("%.10f\n",a*v1/(v1*v1-v2*v2));
        }
    }
    return 0;
}



猜你喜欢

转载自blog.csdn.net/qq_41593380/article/details/80218930
今日推荐