LightOJ 1062 - Crossed Ladders 基础计算几何

http://www.lightoj.com/volume_showproblem.php?problem=1062

题意:问两条平行边间的距离,给出从同一水平面出发的两条相交线段长,及它们交点到水平面的高。

思路:计算几何怎么可能直接算出答案orz解了好久方程觉得不对,应该是二分枚举平行边的距离,通过相似三角形,算出交点的高,与题目比较,小于误差范围就行了。

/** @Date    : 2016-12-10-18.18
  * @Author  : Lweleth ([email protected])
  * @Link    : https://github.com/
  * @Version :
  */
#include<bits/stdc++.h>
#define LL long long
#define PII pair
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std;

const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-8;

int main()
{
    int T;
    int cnt = 0;
    cin >> T;
    while(T--)
    {
        double x, y, c;
        scanf("%lf%lf%lf", &x ,&y ,&c);
        double h1, h2, m;
        double s = 0;
        double l = 0, r = min(x, y);
        while(r - l > eps)
        {
            m = (l + r) / 2.00;
            //cout << m << " ";
            h1 = sqrt(x * x - m * m);
            h2 = sqrt(y * y - m * m);
            s = h1 * h2 / (h1 + h2);
            //cout << s << " ";
            if(fabs(s - c) <= eps)
                break;
            else if(s < c)
                r = m;
            else if(s > c)
                l = m;
        }
        printf("Case %d: %.8lf\n", ++cnt, m);
    }
    return 0;
}
时间: 2024-09-30 10:18:45

LightOJ 1062 - Crossed Ladders 基础计算几何的相关文章

Lightoj 1062 - Crossed Ladders【二分】

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1062 题意: 两个梯子靠墙放,一个长度是x一个长度是y,它们交点到地面的距离是c.求这两个梯子底部的距离. 思路:二分底部的距离t,往计算t' ,根据t和t'的大小关系更新上下界即可. 设宽为mid,那么可以求得 c/sqrt( y^2 - mid^2 ) + c/sqrt( x^2 - mid ^2 ) = 1 代码: #include <stdio.h> #includ

Lightoj 1062 Crossed Ladders (二分)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1062 题意:两根棍子斜放在墙上,给你棍子的长度和他们交点距离地面的高度 ,求两个墙之间的距离 思路:直接枚举距离二分即可 ac代码: #include<stdio.h> #include<math.h> #include<string.h> #include<stack> #include<set> #include<q

poj1584 A Round Peg in a Ground Hole 判断多边形凹凸,点到线的距离【基础计算几何】

大致思路:首先对于所给的洞的点,判断是否是凸多边形,图形的输入和输出可以是顺时针或者逆时针,而且允许多点共线 Debug 了好几个小时,发现如下问题 判断三点是否共线,可用斜率公式判断 POINT point_A, point_B, point_C; if(point_A.x == point_B.x || point_B.x == point_C.x){ if(point_A.x == point_B.x && point_B.x == point_C.x) continue; }els

UVA10566 Crossed Ladders (数学+二分)

UVA10566 Crossed Ladders Description如图1,多组数据,输入x,y,c,求出t的大小,保留三位小数 Hint由相似三角形的知识,我们用两种方法分别表示出图中Lx,就可以得出一个等式关系:$$\frac{1}{b}+\frac{1}{a}=\frac{1}{c} ??(1)$$又有等式$$a=\sqrt{x^2-t^2},b=\sqrt{y^2-t^2}$$把这两式代入(1)式可以得到$$\frac{1}{\sqrt{x^2-t^2}}+\frac{1}{\sqr

lightoj Basic Math 数论基础

这里是除去Beginners Problems后的部分 1020 - A Childhood Game 巴什博奕(Bash Game) #include<bits/stdc++.h> using namespace std; int main(void) { int t,Case=0; int n; char s[10]; scanf("%d",&t); while(t--) { scanf("%d%s",&n,&s); prin

UVA - 10566 Crossed Ladders

给出x,y,c,求?的长度 我的做法: 首先写了一个关于x,y,c,?的表达式,发现拆开后是解一个四元一次方程,比较麻烦 发现表达式的一边是个关于?的单调递减函数后,就用二分来解了 我的代码: #include<iostream> #include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath&g

Kuangbin 带你飞-基础计算几何专题 题解

专题基本全都是模版应用.贴一下模版 const double eps = 1e-8; const int INF = 0x3f3f3f3f; int sgn(double x) { if (fabs(x) < eps) return 0; if (x < 0) return -1; return 1; } struct Point { double x,y; Point(){} Point(double tx,double ty) { x = tx; y = ty; } Point opera

UVA 10566 &amp;&amp; POJ 2507 Crossed Ladders (几何)

题意:两栋楼之间有两个梯子,如图中的虚线所示,一个梯子的长度为x,另一个梯子的长度为y,两个梯子的交点离地面的高度为c,问两栋楼之间的距离. 看到这类的几何题,配有几张情景图,总是有一种莫名的亲切感,有一种想秒A的冲动>=< 解题思路: 在纸上画出图,设宽度为w,交点距左楼距离为a,则根据三角形相似可以推出: 将第二个方程带入到第一个,化简得到:   1=c/sqrt(x*x-w*w)+c/sqrt(y*y-w*w);将得到方程二分求解,即可得到题目所求 代码: #include <st

poj 2507 Crossed ladders 二分解方程

题意: 给两把梯子的长度x,y和他们交点的高度c,求两梯子底部之间的距离. 分析: 化简后得方程c/sqrt(x^2-w^2)+c/sqrt(y^2-w^2)=1,f(w)=c/sqrt(x^2-w^2)+c/sqrt(y^2-w^2)单调增,可以二分解,注意精度. 代码: //poj 2507 //sep9 #include <iostream> #include <cmath> using namespace std; const double eps=1e-8; int ma