P2571 [SCOI2010]传送带-三分套三分

  • P2571 [SCOI2010]传送带
  • 题意:
  • 思路 :分析一波发现,当从AB传送带上离开的位置坐标距离A的远近 与最终的时间 是一个单峰函数,同理
  • 在CD上的点也是单峰函数,所以进行三分一下AB上的坐标 ,check时再对CD上的坐标进行三分。
  • #include<bits/stdc++.h>
    using namespace std;
    double ax,ay,bx,by,cx,cy;
    double dx,dy,q,p,r;
    double lx,rx,ly,ry,ans;
    double mx1,mx2,my1,my2;
    double dis(double x1,double y1,double x2,double y2)
    {
        return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    }
    double ok(double x,double y)
    {
        double llx=cx,lly=cy,rrx=dx,rry=dy;
        double ret=dis(ax,ay,x,y)/p;
        while((abs(rrx-llx)>1e-3)||(abs(rry-lly)>1e-3))
        {
            double x1=llx+(rrx-llx)/3,x2=rrx-(rrx-llx)/3;
            double y1=lly+(rry-lly)/3,y2=rry-(rry-lly)/3;
            double s1=dis(x,y,x1,y1)/r+dis(dx,dy,x1,y1)/q;
            double s2=dis(x,y,x2,y2)/r+dis(dx,dy,x2,y2)/q;
            if(s1<s2)rrx=x2,rry=y2;
            else llx=x1,lly=y1;
        }
        ret+=dis(llx,lly,x,y)/r+dis(llx,lly,dx,dy)/q;
        return ret;
    }
    int main()
    {
        scanf("%lf%lf%lf%lf",&ax,&ay,&bx,&by);
        scanf("%lf%lf%lf%lf",&cx,&cy,&dx,&dy);
        scanf("%lf%lf%lf",&p,&q,&r);
        lx=ax,ly=ay,rx=bx,ry=by;
        while((abs(rx-lx)>1e-3)||(abs(ry-ly)>1e-3))
        {
            mx1=lx+(rx-lx)/3,mx2=rx-(rx-lx)/3;
            my1=ly+(ry-ly)/3,my2=ry-(ry-ly)/3;
            if(ok(mx1,my1)>ok(mx2,my2))lx=mx1,ly=my1;
            else rx=mx2,ry=my2;
        }
        ans=ok(lx,ly);
        printf("%.2lf\n",ans);
        return 0;
    }
    

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值