Crossed Ladders(二分+计算几何)

这个很显然,交点高度和底边长度成反比例函数,可以用二分求解

二分底边,在利用交点求出高度,,判断即可

代码:

#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;}

每一个成功者都有一个开始。勇于开始,才能找到成功的路。

Crossed Ladders(二分+计算几何)

相关文章:

你感兴趣的文章:

标签云: