1.题意:机器人要过(东西)n条流向(南北)不同的河,每条河有自己的流速vi和宽度,机器人可以在起点选择一个方向(以后不可改变),速度 v不变,问能否在限制时间内准确到达目的地(x,0)
2.分析:
机器人要准确到达目的地要满足:
(1)到达(x,0)时,Y方向距离和为0
(2)到达时间<=2*x/v
所以:
假设已知vy,vx , 则竖直距离 = x/vx * vy + (w1/vx * vy1 + w2/vx * vy2 + ...... + wn/vx * vyn) = 0
则: 两边约去vx : x*vy = -(x1*vy1 + x2*vy2 + ....... + wn*vyn) = sum
则: vy = sum/x
则:vx = sqrt(v*v - vy*vy);
验证 time = x/vx <=2*x/v即可
3. 代码:
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100 + 7;
int n,x;
double v,sum;
int main()
{
sum = 0;
scanf("%d%d%lf",&n,&x,&v);
for(int i = 0;i<n;i++){
int l,r;
double vh;
scanf("%d%d%lf",&l,&r,&vh);
sum+=(l - r)*1.0*vh;
}
double timer = 2*x*1.0/v;
double vy = sum/x;
double vx = sqrt(v*v - vy*vy);
if(fabs(vy)>=v)printf("Too hard\n");
else if(x*1.0/vx>timer)printf("Too hard\n");
else printf("%.3lf\n",x*1.0/vx);
return 0;
}