nowCoder:过河(物理分析+定积分)

nowCoder 过河

现在萌新要乘船度过一条河,这条河宽为 sss 米。
现已知船相对于水的速度为v1v_1v1,水流的速度为v2v_2v2
由于萌新想到达起点的正对岸,所以他会一直调整船行驶的方向朝向正对岸
在这里插入图片描述
你的任务是计算萌新将用多少时间度过这条河;若他不能到达起点的正对岸,输出“Infinity”。

输入描述:
第一行输入一个整数nnn,表示测试用例数;
接下来nnn行,每行输入三个整数s、v1、v2s、v_1、v_2sv1v2
其中,1≤n≤1000,0≤s≤100,0≤v1,v2≤1001≤n≤1000,0≤s≤100, 0≤v_1,v_2≤1001n10000s100,0v1,v2100
输出描述:
输出一个实数,你的任务是计算萌新将用多少时间度过这条河(保留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_2v2v1v_1v1方向和垂直于v1v_1v1方向分解后,在v1v_1v1方向有:
∫0T(v1−v2cosθ)dt=s\int_0^T(v_1-v_2cos\theta)dt=s0T(v1v2cosθ)dt=s
将其与第一次分解时的v2v_2v2方向方程:
∫0T(v2−v1cosθ)dt=0\int_0^T(v_2-v_1cos\theta)dt=00T(v2v1cosθ)dt=0
联立有:
T=s∗v1v12−v22T=\frac {s*v_1} {v_1^2-v_2^2}T=v12v22sv1

总结

1.Double占用8字节(64位)的内存空间。 最多可提供16位有效数字,小数点后默认保留6位。 如果都是整数,则最多提供15位有效数字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值