标签:
Problem Description Mr. West bought a new car! So he is travelling around the city.
One day he comes to a vertical corner. The street he is currently in has a width x, the street he wants to turn to has a width y. The car has a length l and a width d.
Can Mr. West go across the corner?
分析:汽车能否顺利转弯取决于在极限情况下,随着角度的变化,汽车离对面路的距离是否大于等于0
如图中
在上图中需要计算转弯过程中h 的最大值是否小于等于y很明显,随着角度θ的增大,最大高度h先增长后减小,即为凸性函数,可以用三分法来求解
#include <iostream>
#include<math.h>
using namespace std;
//x,y表示道路的宽度
//l,w表示汽车长度和宽度
double x,y,l,w;
//定义PI,360度
const double PI = 3.141592653;
double cal(double ag){
//推出的汽车拐弯时所需要的最小高度公式
double s = l * cos(ag) + w * sin(ag) - x;
double h = s * tan(ag) + w * cos(ag);
return h;
}
int main()
{
while(cin >> x >> y >> l >> w){
//变量从0度到180度
double left = 0.0,right = PI/2;
double lm,rm;
//通过三分求出凸点
while((right-left) > 10e-6){
/*
//不懂
lm = (left * 2.0 + right)/3.0;
rm = (left + right * 2.0)/3.0;
*/
//常规三分
lm = (left + right)/2.0;
rm = (lm + right)/2.0;
if(cal(lm) > cal(rm)){
right = rm;
}
else{
left = lm;
}
}
if(cal(left) <= y){
cout << "yes" << endl;
}
else{
cout << "no" << endl;
}
}
return 0;
}
参考了别人的三分代码,不过没有搞懂,最后用的自己的常规三分。不过效果是一样的
标签:
原文地址:http://www.cnblogs.com/2016zhanggang/p/5424131.html