小船过河


 

2018-05-05 20:44:00

链接:https://www.nowcoder.com/acm/contest/118/J
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述


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

你的任务是计算萌新将用多少时间度过这条河;若他不能到达起点的正对岸,输出“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始终朝向正对岸,则v1与岸边的夹角θ是变化的,所以要用积分,如果以v2方向和垂直v2方向分别积分的话,
得到的式子里面既有sin又有cos,会发现无法计算。对这种情况,如果我们换一个思路,不分解v1,分解v2的话,在v1的方向上
对速度积分,就会得到一个式子:
                
把此式子和在v2方向上积分的式子:
                
联立计算,消去cosθ,最终得到:
                 

代码:

 1 #include <iostream>
 2 using namespace std;
 3 int  main()
 4 {
 5     int n;
 6     cin >> n;
 7     while(n--)
 8     {
 9         double s,v1,v2;
10         cin >> s >> v1 >> v2;
11         if(s==0)
12             printf("%.10lf\n",0);
13         else if(v1<=v2)
14             cout << "Infinity" << endl;
15         else
16             printf("%.10lf\n",s*v1/(v1*v1-v2*v2));
17     }
18     return 0;
19 }
View Code

 

    相同题型:Rower Bo

 


 

posted on 2018-05-05 21:17  slp0622  阅读(422)  评论(0编辑  收藏  举报