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