Va 10566-Crossed Ladders (Binary + computational ry)
Obviously, the intersection height and the bottom edge length are inverse proportional functions, which can be solved using two points.
Use the intersection point to locate the height of the two sides.
Code:
# Include
# Include
# Include
# Include using namespace std; struct Point {double x, y; Point () {} Point (double x, double y) {this-> x = x; this-> y = y;} void read () {scanf ("% lf", & x, & y) ;}; typedef Point Vector; vector operator + (Vector A, Vector B) {return Vector (. x + B. x,. y + B. y);} Vector operator-(Vector A, Vector B) {return Vector (. x-B. x,. y-B. y);} Vector operator * (Vector A, double p) {return Vector (. x * P,. y * p);} Vector operator/(Vector A, double p) {return Vector (. x/p,. y/p);} double Cross (Vector A, Vector B) {return. x * B. y-. y * B. x ;}// Cross product Point GetLineIntersection (Point P, Vector v, Point Q, Vector w) {Vector u = P-Q; double t = Cross (w, u) /Cross (v, w); return P + v * t;} double x, y, C; int main () {while (~ Scanf ("% lf", & x, & y, & C) {double l = 0, r = min (x, y ); for (int I = 0; I <100; I ++) {double mid = (l + r)/2; Point a = Point (0, 0 ); point B = Point (mid, sqrt (y * y-mid * mid); Point c = Point (0, sqrt (x * x-mid * mid )); point d = Point (mid, 0); double h = GetLineIntersection (a, B-a, c, d-c ). y; if (h> C) l = mid; else r = mid;} printf ("%. 3f \ n ", l);} return 0 ;}