zoukankan      html  css  js  c++  java
  • [SCOI2010]传送带[三分]

    //point(AB)->point(CD) 距离满足下凸性,用三分套三分实现 
    #include<cmath>
    #include<cstdio>
    #include<iostream>
    #define pf(x) ((x)*(x))
    using namespace std;
    typedef double real;
    const real eps=1e-4;
    real ax,ay,bx,by,cx,cy,dx,dy,P,Q,R,ans;
    inline real dis(real x1,real y1,real x2,real y2){
        return sqrt(pf(x1-x2)+pf(y1-y2));
    }
    inline real trichotomy2_(real x,real y){//CD无斜率
        real l,r,lmid,rmid,t1,t2;
        l=min(cy,dy);r=max(cy,dy);
        while(l+eps<r){
            lmid=(l*2+r)/3,rmid=(l+r*2)/3;
            t1=dis(cx,lmid,x,y)/R+dis(cx,lmid,dx,dy)/Q;
            t2=dis(cx,rmid,x,y)/R+dis(cx,rmid,dx,dy)/Q;
            if(t1<t2) r=rmid;
            else l=lmid;
        }
        t1=dis(cx,l,x,y)/R+dis(cx,l,dx,dy)/Q;
        return t1;
    }
    inline real trichotomy2(real x,real y){//CD有斜率
        if(cx==dx) return trichotomy2_(x,y);
        real l,r,lmid,rmid,k,b,t1,t2;
        l=min(cx,dx);r=max(cx,dx);
        k=(cy-dy)/(cx-dx);
        b=cy-k*cx;
        while(l+eps<r){
            lmid=(l*2+r)/3,rmid=(l+r*2)/3;
            t1=dis(lmid,k*lmid+b,x,y)/R+dis(lmid,k*lmid+b,dx,dy)/Q;
            t2=dis(rmid,k*rmid+b,x,y)/R+dis(rmid,k*rmid+b,dx,dy)/Q;
            if(t1<t2) r=rmid;
            else l=lmid;
        }
        t1=dis(l,k*l+b,x,y)/R+dis(l,k*l+b,dx,dy)/Q;
        return t1;
    }
    inline real trichotomy1(){//AB有斜率 
        real l,r,lmid,rmid,k,b,t1,t2;
        l=min(ax,bx);r=max(ax,bx);
        k=(ay-by)/(ax-bx);
        b=ay-k*ax;
        while(l+eps<r){
            lmid=(l*2+r)/3,rmid=(l+r*2)/3;
            t1=trichotomy2(lmid,k*lmid+b)+dis(lmid,k*lmid+b,ax,ay)/P;
            t2=trichotomy2(rmid,k*rmid+b)+dis(rmid,k*rmid+b,ax,ay)/P;
            if(t1<t2) r=rmid;
            else l=lmid;
        }
        t1=trichotomy2(l,k*l+b)+dis(l,k*l+b,ax,ay)/P;
        ans=min(ans,t1);
    }
    inline real trichotomy1_(){//AB无斜率
        real l,r,lmid,rmid,t1,t2;
        l=min(ay,by);r=max(ay,by);
        while(l+eps<r){
            lmid=(l*2+r)/3,rmid=(l+r*2)/3;
            t1=trichotomy2(ax,lmid)+dis(ax,lmid,ax,ay)/P;
            t2=trichotomy2(ax,rmid)+dis(ax,rmid,ax,ay)/P;
            if(t1<t2) r=rmid;
            else l=lmid;
        }
        t1=trichotomy2(ax,l)+dis(ax,l,ax,ay)/P;
        ans=min(ans,t1);
    }
    int main(){
        cin>>ax>>ay>>bx>>by>>cx>>cy>>dx>>dy;
        cin>>P>>Q>>R;
        ans=dis(ax,ay,dx,dy);
        if(ax!=bx) trichotomy1();
        else trichotomy1_();
        printf("%.2lf",ans);
        return 0;
    }
  • 相关阅读:
    WPF 基于 Azure 的认知服务 情绪分析 语言检测 关键短语提取
    白板类应用的模式交互设计方案
    dotnet Multi-platform App UI 多平台应用 UI 框架简介
    Windows 窗口样式 什么是 WS_EX_NOREDIRECTIONBITMAP 样式
    Windows 对全屏应用的优化
    GitHub Action 新上线 WPF .NET Core 自动构建模板
    为何 WPF 对 vcruntime140 有引用
    用 C# 写脚本 如何输出文件夹内所有文件名
    排序、去重与离散化
    二分
  • 原文地址:https://www.cnblogs.com/shenben/p/6647543.html
Copyright © 2011-2022 走看看