nowCoder 过河
现在萌新要乘船度过一条河,这条河宽为 sss 米。
现已知船相对于水的速度为v1v_1v1,水流的速度为v2v_2v2。
由于萌新想到达起点的正对岸,所以他会一直调整船行驶的方向朝向正对岸。
你的任务是计算萌新将用多少时间度过这条河;若他不能到达起点的正对岸,输出“Infinity”。
输入描述:
第一行输入一个整数nnn,表示测试用例数;
接下来nnn行,每行输入三个整数s、v1、v2s、v_1、v_2s、v1、v2。
其中,1≤n≤1000,0≤s≤100,0≤v1,v2≤1001≤n≤1000,0≤s≤100, 0≤v_1,v_2≤1001≤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
AC代码
#include<iostream>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
while(n--){
int s, v1, v2;
scanf("%d%d%d", &s, &v1, &v2);
if(s == 0) printf("%.10lf\n", 0.0);
else if(v1 <= v2) printf("Infinity\n");
else printf("%.10lf\n", s*v1*1.0 / (v1*v1 - v2*v2));
}
return 0;
}
代码分析
由于速度v1v_1v1始终朝向正对岸,则v1v_1v1与岸边夹角θ\thetaθ始终是变化的,故需要使用积分,若以v2v_2v2方向和垂直于v2v_2v2方向积分,得到的式子里既有sin又有cos,无法继续计算。换一种思路,不分解v1v_1v1,将v2v_2v2在v1v_1v1方向和垂直于v1v_1v1方向分解后,在v1v_1v1方向有:
∫0T(v1−v2cosθ)dt=s\int_0^T(v_1-v_2cos\theta)dt=s∫0T(v1−v2cosθ)dt=s
将其与第一次分解时的v2v_2v2方向方程:
∫0T(v2−v1cosθ)dt=0\int_0^T(v_2-v_1cos\theta)dt=0∫0T(v2−v1cosθ)dt=0
联立有:
T=s∗v1v12−v22T=\frac {s*v_1} {v_1^2-v_2^2}T=v12−v22s∗v1
总结
1.Double占用8字节(64位)的内存空间。 最多可提供16位有效数字,小数点后默认保留6位。 如果都是整数,则最多提供15位有效数字