码迷,mamicode.com
首页 > 其他好文 > 详细

Turn the corner

时间:2016-04-23 11:51:06      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:

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? 

Input
Every line has four real numbers, x, y, l and w.<br>Proceed to the end of file.<br>
 
Output
If he can go across the corner, print "yes". Print "no" otherwise.<br>
 
Sample Input
10 6 13.5 4
10 6 14.5 4
 
Sample Output
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;
}

 

参考了别人的三分代码,不过没有搞懂,最后用的自己的常规三分。不过效果是一样的

Turn the corner

标签:

原文地址:http://www.cnblogs.com/2016zhanggang/p/5424131.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!