hdu 3400 Line belt (三分套三分)

题目链接:hdu 3400 Line belt 

题意:

在二维平面上给你两条线段AB,CD,线段上的速度分别是v1,v2,在线段外的速度为v3.

问从A到D最短的时间需要多少。

题解:

三分AB上的一个点,三分CD上的一个点。

即三分套三分。

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=(a);i<=(b);++i)
 3 using namespace std;
 4 typedef long long ll;
 5 typedef pair<double,double>P;
 6 int t;
 7 double v1,v2,v3;
 8 P a[4];
 9 
10 double dis(P a,P b){return sqrt(pow(a.first-b.first,2)+pow(a.second-b.second,2));}
11 
12 double check2(P x,P y){return dis(x,y)/v3+dis(y,a[0])/v1+dis(x,a[3])/v2;}
13 
14 double sanfen2(P x)
15 {
16     P l=a[2],r=a[3],mid,mmid;
17     F(i,1,100)
18     {
19         mid=P((l.first+r.first)/2,(l.second+r.second)/2);
20         mmid=P((mid.first+r.first)/2,(mid.second+r.second)/2);
21         if(check2(mid,x)>check2(mmid,x))l=mid;
22         else r=mmid;
23     }
24     return check2(l,x);
25 }
26 
27 double check(P x){return sanfen2(x);}
28 
29 double sanfen()
30 {
31     P l=a[0],r=a[1],mid,mmid;
32     F(i,1,100)
33     {
34         mid=P((l.first+r.first)/2,(l.second+r.second)/2);
35         mmid=P((mid.first+r.first)/2,(mid.second+r.second)/2);
36         if(check(mid)>check(mmid))l=mid;
37         else r=mmid;
38     }
39     return check(l);
40 }
41 
42 int main()
43 {
44     scanf("%d",&t);
45     while(t--)
46     {
47         scanf("%lf%lf%lf%lf",&a[0].first,&a[0].second,&a[1].first,&a[1].second);
48         scanf("%lf%lf%lf%lf",&a[2].first,&a[2].second,&a[3].first,&a[3].second);
49         scanf("%lf%lf%lf",&v1,&v2,&v3);
50         printf("%.2f
",sanfen());
51     }
52     return 0;
53 }
View Code
原文地址:https://www.cnblogs.com/bin-gege/p/7132752.html