专题二 · 1016

代码及解释

#include <cstdio>
#include <cmath>

// 无脑三分法
// 直接在固定一边的情况下三分就可以
//
// 比较恶心的就是要写很多运算=-=

struct
point { double x, y; };


double dis(point a, point b) {
    return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}


double p,q,r;


double find2(point a, point c, point d) {
    point left, right;
    point mid, midmid;
    
    double t1,t2;
    left = c;
    right = d;
    
    do {
        mid.x = (left.x + right.x) / 2;
        mid.y = (left.y + right.y) / 2;
        
        midmid.x = (mid.x + right.x) / 2;
        midmid.y = (mid.y + right.y) / 2;
        
        t1 = dis(a, mid) / r + dis(mid, d) / q;
        t2 = dis(a, midmid) / r + dis(midmid, d) / q;
        
        if(t1 > t2)
            left=mid;
        else
            right=midmid;
    }
    while(dis(left, right) >= 1e-5);
    return t1;
}


double find(point a, point b, point c, point d) {
    point left, right;
    point mid, midmid;
    
    double t1, t2;
    left = a;
    right = b;
    
    do {
        mid.x = (left.x + right.x) / 2;
        mid.y = (left.y + right.y) / 2;
        
        midmid.x = (mid.x + right.x) / 2;
        midmid.y = (mid.y + right.y) / 2;
        
        t1 = dis(a, mid) / p + find2(mid, c, d);
        t2 = dis(a, midmid) / p + find2(midmid, c, d);
        
        if(t1 > t2)
            left = mid;
        else
            right = midmid;
        
    } while(dis(right, left) >= 1e-5);
    
    return t1;
}

int main() {
    
    int t;
    point a, b, c, d;
    scanf("%d", &t);
    
    while(t--) {
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&d.x,&d.y,&p,&q,&r);
        printf("%.2lf\n",find(a,b,c,d));
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值