[BZOJ1857][SCOI2010]传送带

三分套三分,因为是单峰的。。。
代码:


#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double eps=1e-4;
struct pt
{
    double x,y;
}a,b,c,d;
double p,q,R;
double dis(pt a,pt b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
double cal(pt m)
{
    pt l=c,r=d;
    while(abs(l.x-r.x)>eps||abs(l.y-r.y)>eps)
    {
        pt n1=(pt){(2*l.x+r.x)/3,(2*l.y+r.y)/3},n2=(pt){(l.x+2*r.x)/3,(l.y+2*r.y)/3};
        if(dis(m,n1)/R+dis(n1,d)/q<dis(m,n2)/R+dis(n2,d)/q) r=n2;else l=n1;
    }
    return dis(m,l)/R+dis(l,d)/q;
}
int main()
{
    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);
    pt l=a,r=b;
    while(abs(l.x-r.x)>eps||abs(l.y-r.y)>eps)
    {
        pt m1=(pt){(2*l.x+r.x)/3,(2*l.y+r.y)/3},m2=(pt){(l.x+2*r.x)/3,(l.y+2*r.y)/3};
        if(dis(a,m1)/p+cal(m1)<dis(a,m2)/p+cal(m2)) r=m2;else l=m1;
    }
    printf("%.2lf",dis(a,l)/p+cal(l));
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值