zoukankan      html  css  js  c++  java
  • CF 8D Two Friends 三分再三分

    代碼如下

    #include <set>
    #include <map>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <string>
    #include <vector>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    typedef long long ll;
    typedef unsigned long long ull;
    
    #define debug puts("here")
    #define rep(i,n) for(int i=0;i<n;i++)
    #define REP(i,a,b) for(int i=a;i<b;i++)
    #define foreach(i,vec) for(unsigned i=0;i<vec.size();i++)
    #define pb push_back
    #define RD(n) scanf("%d",&n)
    
    double X1,Y1,X2,Y2,X3,Y3;
    double t1,t2;
    
    double dis(double x,double y){
        return sqrt(x*x+y*y);
    }
    
    double dis(double x1,double y1,double x2,double y2){
        return dis(x1-x2,y1-y2);
    }
    
    double solve(double x1,double y1,double x2,double y2,double t,double px,double py){
        if(dis(x1,y1,px,py)+dis(px,py,x2,y2)-dis(x1,y1,x2,y2)<=t)
            return dis(x1,y1,x2,y2)+t-dis(px,py,x2,y2);
        double l = 0,r = 1;
        rep(step,300){
            double M = (l+r)/2;
            double dx = (1-M)*x1+M*px;
            double dy = (1-M)*y1+M*py;
            double tmp = dis(x1,y1,dx,dy)+dis(dx,dy,x2,y2)-dis(x1,y1,x2,y2);
            if(tmp<=t)
                l = M;
            else
                r = M;
        }
        return l*dis(x1,y1,px,py);
    }
    
    double cc(double x,double y){
        double tmp = solve(X1,Y1,X2,Y2,t2,x,y);
        double ret = solve(X1,Y1,X3,Y3,t1,x,y);
        return min(tmp,ret);
    }
    
    int main(){
    
    #ifndef ONLINE_JUDGE
      freopen("sum.in","r",stdin);
    	//freopen("sum.out","w",stdout);
    #endif
    
        while(cin>>t1>>t2){
            cin>>X1>>Y1>>X2>>Y2>>X3>>Y3;
    
            double tmp = dis(X1,Y1,X3,Y3)+dis(X3,Y3,X2,Y2);
            double ret = dis(X1,Y1,X2,Y2)+t2;
    
            double ans = 0;
            ans = max(cc(X2,Y2),cc(X3,Y3));
    
            if(tmp<=ret){
                printf("%.6lf\n",min(ret,tmp+t1));
                continue;
            }
    
            double l = 0, r = 1;
            rep(i,300){
                double M1 = (l*2+r)/3;
                double M2 = (l+r*2)/3;
                double px1 = X2*(1-M1)+X3*M1 , py1 = Y2*(1-M1)+Y3*M1;
                double px2 = X2*(1-M2)+X3*M2 , py2 = Y2*(1-M2)+Y3*M2;
                ret = cc(px1,py1);
                tmp = cc(px2,py2);
                ans = max(ans,max(ret,tmp));
                if(ret>tmp)
                    r = M2;
                else
                    l = M1;
            }
            printf("%.6lf\n",ans);
        }
    	return 0;
    }
    

      

  • 相关阅读:
    2-SAT模板
    AC自动机
    省选预备营-Day3(图论) 总结
    省选预备营-Day2(分治) 总结
    左偏树(可并堆)总结
    省选预备营-Day1(数据结构) 总结
    OI基础知识
    C++ 堆
    CH4601 普通平衡树
    java 函数形参传值和传引用的区别
  • 原文地址:https://www.cnblogs.com/yejinru/p/3021042.html
Copyright © 2011-2022 走看看