代碼如下
#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;
}