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\n",sanfen()); 51 } 52 return 0; 53 }