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;
}

  

原文地址:https://www.cnblogs.com/yejinru/p/3021042.html