HDU 2438 Turn the corner 三分

傳送門

這張圖很好說明

題目大意是給你兩個街道的寬度X,Y,以及汽車長度L ,汽車寬度W
問你汽車能不能從X街道開到Y街道

一開始想是不是數學問題,直到看到網上的圖片才知道這個是三分

三分只要知道凸函數就基本知道怎麼寫了

畢竟是模板

有了紅線代表的那個函數,我們就能知道,汽車過彎所需要的最小寬度

因此我們三分角度然後求出x即橫座標

三分出最大的x然後再比較就行了

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
#define MIN 1e-7
#define PI acos(-1.0)
double x,y,l,w;


double clac(double k)
{
  return (x - l*sin(k) - w/cos(k)) / tan(k);
}


int main()
{
    while(~scanf("%lf%lf%lf%lf",&x,&y,&l,&w))
    {
        int size = 100;
        double left = 0 , right = PI*0.5;
        double mid = 0 , midmid = 0 , ans1, ans2;
        if(x<w || y<w) {printf("no\n");continue;}//直接判斷過不去
        while(size--){
            mid = (left+right)/2.0;
            midmid = (mid + right)/2.0;
            ans1 = clac(mid) , ans2 = clac(midmid);
            if(ans1<ans2) right = midmid;
            else left = mid;
        }
        if(fabs(ans1)>y) printf("no\n");
        else printf("yes\n");
    }
    return 0;
}

三分說到底就是求公式以及找切入點
剛入門得花點時間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章