1005 Turn the corner

1005 Turn the corner

题意:长L宽W的汽车,判断它是否能够从宽度为X的街道进入宽度为Y的街道。

思路:

在通过分析后可以得到,随着汽车由X进入Y,图中H的高度先增大后减小,而解几何图形后可得s = l * cos(θ) + w * sin(θ) - x;

h =s * tan(θ) + w * cos(θ);在题目中,因为高度先增大后减小,高度的增长趋势并不确定,因此需要用三分法。

 

感想:一开始看到题,有些懵,后来知道了其中的关系式后,再利用三分解答,倒也并没有什么困难了!

#include<iostream>

#include<stdio.h>

#include<math.h>

using namespace std;

double pi=acos(-1.0);

double x,y,l,w,h,s;

double car(double a){

  s=l*cos(a)+w*sin(a)-x;

  h=s*tan(a)+w*cos(a);

  return h;

}

int main(){

  double f,r,mid,midmid;

  while(scanf("%lf%lf%lf%lf",&x,&y,&l,&w)!=EOF){

      f=0.0;

      r=pi/2;

      while(fabs(r-f)>1e-10){

         mid=(f+r)/2;

         midmid=(mid+r)/2;

         if(car(mid)>=car(midmid)) r=midmid;

         else  f=mid;

      }

      if(car(mid)<=y)  cout<<"yes"<<endl;

      else cout<<"no"<<endl;

   }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值