您的位置:首页 > 其它

Turn the corner

2016-04-21 19:31 351 查看
[align=left]Problem Description[/align]
Mr. West bought a new car! So he is travelling around the city.<br><br>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.<br><br>Can Mr. West go across the corner?<br><img src=../../../data/images/2438-1.jpg><br>
 

[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<br>10 6 14.5 4<br>

 

[align=left]Sample Output[/align]

yes<br>no<br>

 

[align=left]Source[/align]
2008 Asia Harbin Regional Contest Online
 简单题意:
Mr.west 买了一辆新车,他在城市中旅行。一天,他驾车来到了一个垂直的角落。他想通过此弯道,现在给出车子的长和宽,以及直角弯道的宽度和他现在没转弯之前的街道宽度。现在写出一个程序,求出他能不能通过该弯道。
解题思路形成过程:
  容易得到一个单调三角函数,所以这也是一个简单的二分法。
感想:
   数学函数的构建是难点。
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm