zoukankan      html  css  js  c++  java
  • bzoj1857 [ SCOI2010 ] -- 三分套三分

    显然我们一定是先走到AB上一点X,然后走到CD上一点Y,最后到D。

    那么答案就是|AX|/P+|XY|/R+|YD|/Q

    假设我们已经确定了X,那么目标就是在CD上找一点Y,使|XY|/R+|YD|/Q最小。

    显然这是个单峰函数。

    那么三分套三分就可以了。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    #define Eps 1e-3
    struct Node{
        double x,y;
        Node(){}
        Node(double x,double y):x(x),y(y){}
        Node operator + (Node a){return Node(x+a.x,y+a.y);}
        Node operator - (Node a){return Node(x-a.x,y-a.y);}
        Node operator / (double a){return Node(x/a,y/a);}
        inline void Read(){scanf("%lf%lf",&x,&y);}
    }a,b,c,d,l,r,m1,m2;
    int i,j,k,n,m,p,v1,v2,v3;
    inline double Dis(Node a,Node b){
        return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    }
    inline double Get(Node a,Node b,Node c,Node d){
        return Dis(a,b)/v1+Dis(b,c)/v3+Dis(c,d)/v2;
    }
    inline double Calc(Node x){
        Node l=c,r=d,m1,m2;
        while(Dis(l,r)>Eps){
            m1=(r-l)/3;m2=r-m1;m1=l+m1;
            if(Get(a,x,m1,d)>Get(a,x,m2,d))l=m1;else r=m2;
        }
        return Get(a,x,l,d);
    }
    int main(){
        a.Read();b.Read();c.Read();d.Read();
        scanf("%d%d%d",&v1,&v2,&v3);
        l=a;r=b;
        while(Dis(l,r)>Eps){
            m1=(r-l)/3;m2=r-m1;m1=l+m1;
            if(Calc(m1)>Calc(m2))l=m1;else r=m2;
        }
        printf("%.2lf
    ",Calc(l));
        return 0;
    }
    bzoj1857
  • 相关阅读:
    springcloud-04-自定义ribbon的配置方式
    springcloud-03-服务注册
    springcloud-02-eureka
    springcloud-01-介绍
    使用jdk生成ssl证书文件
    CentOS7忘记root密码的修改方法
    2.1 Scala语言概述
    1.大数据技术概述
    KL散度=交叉熵-熵
    7.数据结构---图(遍历)
  • 原文地址:https://www.cnblogs.com/gjghfd/p/6879355.html
Copyright © 2011-2022 走看看