这个很显然,交点高度和底边长度成反比例函数,可以用二分求解
二分底边,在利用交点求出高度,判断即可
代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
struct Point {
double x, y;
Point() {}
Point(double x, double y) {
this->x = x;
this->y = y;
}
void read() {
scanf("%lf%lf", &x, &y);
}
};
typedef Point Vector;
Vector operator + (Vector A, Vector B) {
return Vector(A.x + B.x, A.y + B.y);
}
Vector operator - (Vector A, Vector B) {
return Vector(A.x - B.x, A.y - B.y);
}
Vector operator * (Vector A, double p) {
return Vector(A.x * p, A.y * p);
}
Vector operator / (Vector A, double p) {
return Vector(A.x / p, A.y / p);
}
double Cross(Vector A, Vector B) {return A.x * B.y - A.y * B.x;} //叉积
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%lf%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;
}