您的位置:首页 > 其它

Turn the corner

2016-04-23 10:50 190 查看
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?

[align=left]Input[/align]
Every line has four real numbers, x, y, l and w.<br>Proceed to the end of file.<br>

[align=left]Output[/align]
If he can go across the corner, print "yes". Print "no" otherwise.<br>

[align=left]Sample Input[/align]

10 6 13.5 4
10 6 14.5 4

[align=left]Sample Output[/align]

yes
no

题意:有一个宽w,长l的车要从宽度为x的街道转到宽度为y的街道,问问能不能过去。
思路:看到这个题,不知道怎么下手。下面是参考的思路

分析:汽车能否顺利转弯取决于在极限情况下,随着角度的变化,汽车离对面路的距离是否大于等于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;
}

参考了别人的三分代码,不过没有搞懂,最后用的自己的常规三分。不过效果是一样的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: