三分法

B8BFDBADD31C72A2B05A31DA94CA100B
//洛谷P2571传送带
#include <bits/stdc++.h>
using namespace std;
const double esp=0.00001;
double xa,ya,xb,yb,xc,yc,xd,yd,q,p,r;
double count(double xe,double ye,double xf,double yf){
  return ((sqrt((xe-xa)*(xe-xa)+(ye-ya)*(ye-ya)))/p)+
  ((sqrt((xf-xe)*(xf-xe)+(ye-yf)*(ye-yf)))/r)+
  ((sqrt((xd-xf)*(xd-xf)+(yd-yf)*(yd-yf)))/q);
}
double narrow(double x,double y){
    double fcx=xc,fdx=xd,fcy=yc,fdy=yd,minn;
    while(fabs(fcx-fdx)>esp||fabs(fcy-fdy)>esp){
        double midx=(fcx+fdx)/2,midy=(fcy+fdy)/2;
        double remidx=(midx+fdx)/2,remidy=(midy+fdy)/2;
        double ans1=count(x,y,midx,midy),ans2=count(x,y,remidx,remidy);
    if(ans1>ans2){
        fcx=midx,fcy=midy;
    }
    else{
        fdx=remidx,fdy=remidy;
    }
    minn=min(ans1,ans2);
  }      
  return minn;
}
int main(){
    cin>>xa>>ya>>xb>>yb>>xc>>yc>>xd>>yd>>p>>q>>r;
    double fax=xa,fbx=xb,fay=ya,fby=yb,minn;
    while(1){
        double midx=(fax+fbx)/2,midy=(fay+fby)/2;
        double remidx=(midx+fbx)/2,remidy=(midy+fby)/2;
        double ans1=narrow(midx,midy),ans2=narrow(remidx,remidy);
        if(ans1>ans2){
            fax=midx,fay=midy;
        }
        else{
            fbx=remidx,fby=remidy;
        } 
        minn=min(ans1,ans2);   
        if(fabs(fax-fbx)<esp&&fabs(fay-fby)<esp){
            break;
        }
    }
    printf("%.2lf",minn);
    return 0;
}

 

posted @ 2026-05-30 18:50  heccqwq  阅读(4)  评论(0)    收藏  举报