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}{\sqrt{y^2-t^2}}=\frac{1}{c}$$
我们并不需要把它解出来
可以发现左边的式子关于t是单调的,所以我们二分t即可

Code

#include <cmath>
#include <cstdio>
#include <iostream>
#include <algorithm>
#define siz
#define minn(a,b) (a<b?a:b)
using namespace std;
double x, y, c;
double work(double t) {
    return 1 / sqrt(x * x - t * t) + 1 / sqrt(y * y - t * t);
}
int main() {

    while( ~scanf("%lf%lf%lf",&x,&y,&c) ) {
        double l = 0, r = minn(x,y), mid;
        while(r - l > 1e-5) {
            mid = l + (r - l) / 2;
            if( work(mid) > (1/c) ) r=mid;
            else l=mid;
        }
        printf("%.3lf\n",mid);
    }
    return 0;
}

Tips

  • mid = l + (r - l) / 2; 之所以这样求mid,是怕有恶心数据让(l+r)越界
  • (r-l)>>1 是错误的! double是不能使用右移运算的

?

原文地址:https://www.cnblogs.com/LonelyRyan/p/9300433.html

时间: 2024-07-31 05:34:06

UVA10566 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

UVA 10668 - Expanding Rods(数学+二分)

UVA 10668 - Expanding Rods 题目链接 题意:给定一个铁棒,如图中加热会变成一段圆弧,长度为L′=(1+nc)l,问这时和原来位置的高度之差 思路:画一下图可以很容易推出公式,设圆弧扇形部弧度r,那么可以计算出铁棒长度为lr/sin(r)这个公式在[0, pi/2]是单调递增的,所以可以用二分法去求解 要注意的一点是最后答案计算过程中带入mid,之前是带入x(二分的左边值),可实际上x是可能等于0的,而带入mid,由于是double型,所以mid实际上表示是一个非常趋近0

HDU 6216 A Cubic number and A Cubic Number(数学/二分查找)

题意: 给定一个素数p(p <= 1e12),问是否存在一对立方差等于p. 分析: 根据平方差公式: 因为p是一个素数, 所以只能拆分成 1*p, 所以 a-b = 1. 然后代入a = b + 1. 求出 3a2 + 3a + 1 = p 化简得a(a+1) = (p-1)/3 令(p-1)/3 = T, 问题化为是否存在整数a使得a(a+1) == T, 那么令 t = (int)sqrt(T),只要判定一下t * (t+1) == T ? 即可 另一种做法是打一个a的表(a只要打到1e6)

UVA - 10029 Edit Step Ladders (二分+hash)

Description Problem C: Edit Step Ladders An edit step is a transformation from one word x to another word y such that x and y are words in the dictionary, and x can be transformed to y by adding, deleting, or changing one letter. So the transformatio

ACM学习历程—HDU5587 Array(数学 &amp;&amp; 二分 &amp;&amp; 记忆化 || 数位DP)(BestCoder Round #64 (div.2) 1003)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5587 题目大意就是初始有一个1,然后每次操作都是先在序列后面添加一个0,然后把原序列添加到0后面,然后从0到末尾,每一个都加上1. 例如:a0, a1, a2 => a0, a1, a2, 1, a0+1, a1+1, a2+1 题解中是这么说的:“ 其实Ai为i二进制中1的个数.每次变化A{k+2^i}=A{k}+1,(k<2^?i??)不产生进位,二进制1的个数加1.然后数位dp统计前m个数二

LightOJ 1062 - Crossed Ladders 基础计算几何

http://www.lightoj.com/volume_showproblem.php?problem=1062 题意:问两条平行边间的距离,给出从同一水平面出发的两条相交线段长,及它们交点到水平面的高. 思路:计算几何怎么可能直接算出答案orz解了好久方程觉得不对,应该是二分枚举平行边的距离,通过相似三角形,算出交点的高,与题目比较,小于误差范围就行了. /** @Date : 2016-12-10-18.18 * @Author : Lweleth ([email protected])

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

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