Advertisement
Abrar_Al_Samit

Closest Distance LOJ 1146

May 2nd, 2022
965
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.57 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const double eps = 1e-10;
  5.  
  6. struct point{
  7.   long double x, y;
  8. };
  9.  
  10. long double distance(point a, point b) {
  11.   long double retsq = abs(a.x-b.x)*abs(a.x-b.x) + abs(a.y-b.y)*abs(a.y-b.y);
  12.   long double ret = sqrtl(retsq);
  13.   return ret;
  14. }
  15.  
  16. point move(point A, point B, long double len) {
  17.   point ret;
  18.   long double AB = distance(A, B);
  19.  
  20.   //ratios
  21.   long double m1 = len/AB;
  22.   long double m2 = 1-m1;
  23.  
  24.   ret.x = (A.x*m2+B.x*m1)/(m1+m2);
  25.   ret.y = (A.y*m2+B.y*m1)/(m1+m2);
  26.   return ret;
  27. }
  28.  
  29. void PlayGround() {
  30.   point A, B, C, D;
  31.   cin>>A.x>>A.y>>B.x>>B.y>>C.x>>C.y>>D.x>>D.y;
  32.  
  33.   //lengths
  34.   long double AB = distance(A, B);
  35.   long double CD = distance(C, D);
  36.  
  37.   //assuming the total time taken is 1 second
  38.   long double v1 = AB, v2 = CD; //velocities
  39.  
  40.  
  41.   long double ans = LLONG_MAX;
  42.   long double l = 0, r = 1;
  43.   while(r-l>eps) {
  44.     long double m1 = l+(r-l)/3;
  45.     long double m2 = r-(r-l)/3;
  46.  
  47.     point _A1 = move(A, B, m1*v1);
  48.     point _C1 = move(C, D, m1*v2);
  49.  
  50.     point _A2 = move(A, B, m2*v1);
  51.     point _C2 = move(C, D, m2*v2);
  52.  
  53.     long double d1 = distance(_A1, _C1);
  54.     long double d2 = distance(_A2, _C2);
  55.  
  56.     if(d1<d2) {
  57.       ans = d1;
  58.       r = m2;
  59.     } else {
  60.       ans = d2;
  61.       l = m1;
  62.     }
  63.   }
  64.  
  65.   cout<<setprecision(6)<<fixed<<ans<<'\n';
  66. }
  67. int main() {
  68.   ios_base::sync_with_stdio(false);
  69.   cin.tie(NULL);
  70.   cerr<<setprecision(15)<<fixed;
  71.  
  72.   int T;
  73.   cin >> T;
  74.   for(int i=1; i<=T; ++i) {
  75.     cout << "Case " << i << ": ";
  76.     PlayGround();
  77.   }
  78.   return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement