程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> UVA 10566 - Crossed Ladders(二分+計算幾何)

UVA 10566 - Crossed Ladders(二分+計算幾何)

編輯:C++入門知識

UVA 10566 - Crossed Ladders(二分+計算幾何)


這個很顯然,交點高度和底邊長度成反比例函數,可以用二分求解

二分底邊,在利用交點求出高度,判斷即可

代碼:

 

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


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved