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
  • 相关阅读:
    [SDOI 2009] 晨跑
    [ZJOI 2009] 假期的宿舍
    [BZOJ 2006] 狼抓兔子
    [BZOJ 1691] 挑剔的美食家
    [HNOI 2015] 菜肴制作
    [Codeforces 489E] Nastya and King-Shamans
    sum(sum(abs(y))) 中 sum(sum())什么意思?
    matlab 函数 bwarea
    系统启动挂载根文件系统时Kernel panic
    rmmod: chdir(/lib/modules): No such file or directory
  • 原文地址:https://www.cnblogs.com/gjghfd/p/6879355.html
Copyright © 2011-2022 走看看