题意
就是给你两条线段AB , CD ,一个人在AB以速度p跑,在CD上以q跑,
在其他地方跑速度是r。问你从A到D最少的时间。
三分AB ,然后再三分CD ,模板题目,这题卡精度 eps不能少
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <cmath> 5 #include <algorithm> 6 #include <set> 7 #include <iostream> 8 #include <map> 9 #include <stack> 10 #include <string> 11 #include <vector> 12 #define pi acos(-1.0) 13 #define eps 1e-9 14 #define fi first 15 #define se second 16 #define rtl rt<<1 17 #define rtr rt<<1|1 18 #define bug printf("******\n") 19 #define mem(a,b) memset(a,b,sizeof(a)) 20 #define name2str(x) #x 21 #define fuck(x) cout<<#x" = "<<x<<endl 22 #define f(a) a*a 23 #define sf(n) scanf("%d", &n) 24 #define sff(a,b) scanf("%d %d", &a, &b) 25 #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c) 26 #define sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d) 27 #define pf printf 28 #define FRE(i,a,b) for(i = a; i <= b; i++) 29 #define FREE(i,a,b) for(i = a; i >= b; i--) 30 #define FRL(i,a,b) for(i = a; i < b; i++)+ 31 #define FRLL(i,a,b) for(i = a; i > b; i--) 32 #define FIN freopen("data.txt","r",stdin) 33 #define gcd(a,b) __gcd(a,b) 34 #define lowbit(x) x&-x 35 using namespace std; 36 typedef long long LL; 37 typedef unsigned long long ULL; 38 const int mod = 1e9 + 7; 39 const int maxn = 2e5 + 10; 40 const int INF = 0x3f3f3f3f; 41 const LL INFLL = 0x3f3f3f3f3f3f3f3fLL; 42 int t; 43 double P, Q, R, len1, len2; 44 struct node { 45 double x, y; 46 } a, b, c, d, temp1, temp2; 47 double dist ( node a, node b ) { 48 return sqrt ( eps + ( a.x - b.x ) * ( a.x - b.x ) + ( a.y - b.y ) * ( a.y - b.y ) ); 49 } 50 void caltemp1 ( double cnt ) { 51 temp1.x = a.x + ( b.x - a.x ) / len1 * cnt; 52 temp1.y = a.y + ( b.y - a.y ) / len1 * cnt; 53 } 54 void caltemp2 ( double cnt ) { 55 temp2.x = d.x + ( c.x - d.x ) / len2 * cnt; 56 temp2.y = d.y + ( c.y - d.y ) / len2 * cnt; 57 } 58 double check ( double cnt ) { 59 caltemp1 ( cnt ); 60 double l = 0, r = len2, ll, rr, ans1, ans2; 61 while ( r - l > eps ) { 62 ll = ( 2 * l + r ) / 3, rr = ( 2 * r + l ) / 3; 63 caltemp2 ( ll ); 64 ans1 = dist ( temp1, temp2 ) / R + dist ( d, temp2 ) / Q; 65 caltemp2 ( rr ); 66 ans2 = dist ( temp1, temp2 ) / R + dist ( d, temp2 ) / Q; 67 if ( ans1 < ans2 ) r = rr; 68 else l = ll; 69 } 70 return ans1 + dist ( temp1, a ) / P; 71 } 72 int main() { 73 scanf ( "%d", &t ); 74 while ( t-- ) { 75 scanf ( "%lf%lf%lf%lf", &a.x, &a.y, &b.x, &b.y ); 76 scanf ( "%lf%lf%lf%lf", &c.x, &c.y, &d.x, &d.y ); 77 scanf ( "%lf%lf%lf", &P, &Q, &R ); 78 len1 = dist ( a, b ), len2 = dist ( c, d ); 79 double l = 0, r = len1, ll, rr; 80 while ( r - l > eps ) { 81 ll = ( 2 * l + r ) / 3, rr = ( 2 * r + l ) / 3; 82 if ( check ( ll ) < check ( rr ) ) r = rr; 83 else l = ll; 84 } 85 printf ( "%.2f\n", check ( ll ) ); 86 } 87 return 0; 88 }
原文地址:https://www.cnblogs.com/qldabiaoge/p/9979604.html
时间: 2024-10-11 16:07:19