CF 8D Two Friends (three points + Two points)

Source: Internet
Author: User

Question: There are three points: p0, p1, and p2. There are two alice and bob, whose initial position is p0. Now alice needs to go to p2 first and then to p1. bob is directed to p1. Design a line so that they can take the journey as long as possible (not counted after meeting ). The difference between alice's distance and the shortest path is not greater than t1, and bob is not greater than t2. The question is confused. It can be proved that the optimal separation point must be between triangles consisting of p0, p1, and p2. Therefore, we can find the angle of p0. Once the angle is determined, the farthest journey can be obtained through two points. At the same time, it is found that when the angle deviation between the left and right, it will only benefit one side, so the three-point angle and the two-point distance. The angle can be three points on p1 and p2. In addition, pay attention to some special situations, such as bob first going to p2 and then to p1. Walking along p1 and p2.

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <vector>#include <map>#include <queue>#include <set>#include <ctime>#define lson step<<1#define rson step<<1|1#define mem(a,b) memset(a,b,sizeof(a))#define pb(a) push_back(a)#define mp(a,b) make_pair(a,b)#define pii pair<int,int>using namespace std;typedef long long LL;struct Point{double x,y;Point(){}Point(double _x,double _y):x(_x),y(_y){}void input(){scanf("%lf%lf",&x,&y);}}p0,p1,p2;double t1,t2;double sqr(double a){return a*a;}double dist(Point p1,Point p2){return sqrt(sqr(p1.x-p2.x)+sqr(p1.y-p2.y));}// s->e , p at the line of s->m , s->p + p->e <= t + s->edouble solve(Point s,Point e,Point m,double t){if(dist(s,m)+dist(m,e)<=t+dist(s,e))return dist(s,e)+t-dist(m,e);double low=0.0,high=1.0,mid;for(int step=1;step<=1000;step++){mid=(low+high)/2.0;Point p=Point(s.x+mid*(m.x-s.x),s.y+mid*(m.y-s.y));if(dist(s,p)+dist(p,e)<=t+dist(s,e)) low=mid;else high=mid;}return mid*dist(s,m);}int main(){scanf("%lf%lf",&t1,&t2);p0.input();p1.input();p2.input();double low=0.0,high=1.0,mid,midd,ans=0.0;ans=max(ans,min(solve(p0,p1,p1,t2),solve(p0,p2,p1,t1)));ans=max(ans,min(solve(p0,p1,p2,t2),solve(p0,p2,p2,t1)));if(dist(p0,p2)+dist(p2,p1)<=t2+dist(p0,p1)){ans=max(ans,min(dist(p0,p1)+t2,dist(p0,p2)+dist(p2,p1)+t1));}for(int step=1;step<=1000;step++){mid=low+(high-low)/3.0;midd=high-(high-low)/3.0;Point pa=Point(p1.x+(p2.x-p1.x)*mid,p1.y+(p2.y-p1.y)*mid);Point pb=Point(p1.x+(p2.x-p1.x)*midd,p1.y+(p2.y-p1.y)*midd);double r1=min(solve(p0,p1,pa,t2),solve(p0,p2,pa,t1));double r2=min(solve(p0,p1,pb,t2),solve(p0,p2,pb,t1));if(r1>r2) high=midd,ans=max(ans,r1);else low=mid,ans=max(ans,r2); }printf("%.10f\n",ans);return 0;}

 


Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.