1.简明题意
检测汽车拐弯的时候是否会碰到街道
2.解题思路、
汽车拐弯问题,给定X, Y, l, d判断是否能够拐弯。首先当X或者Y小于d,那么一定不能。
其次我们发现随着角度θ的增大,最大高度h先增长后减小,即为凸性函数,可以用三分法来求解。
这里的Calc函数需要比较繁琐的推倒公式:
s = l * cos(θ) + w * sin(θ) - x;
h = s * tan(θ) + w * cos(θ);
其中s为汽车最右边的点离拐角的水平距离, h为里拐点最高的距离, θ范围从0到90。
3.AC代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define pi 3.1415
using namespace std;
const double eps = 1e-4;
double l, x, y, w;
double calu(double a) {
return l*cos(a) + (w - x*cos(a)) / sin(a);
}
double ternary_search(double l, double r) {
double ll, rr;
while (r - l>eps) {
ll = (2 * l + r) / 3;
rr = (2 * r + l) / 3;
if (calu(ll)>calu(rr))
r = rr;
else
l = ll;
}
return r;
}
int main()
{
while (cin >> x >> y >> l >> w) {
double l = 0, r = pi / 2;
double tmp = ternary_search(l, r);
if (calu(tmp) <= y)
puts("yes");
else
puts("no");
}
return 0;
}