Lightoj 1062 Crossed Ladders (二分)

来源:互联网 发布:网络主播年收入排行榜 编辑:程序博客网 时间:2024/05/22 09:44

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1062

题意:两根棍子斜放在墙上,给你棍子的长度和他们交点距离地面的高度
,求两个墙之间的距离
思路:直接枚举距离二分即可
ac代码:

#include<stdio.h>#include<math.h>#include<string.h>#include<stack>#include<set>#include<queue>#include<vector>#include<iostream>#include<algorithm>#define MAXN 1010000#define LL long long#define ll __int64#define INF 0xfffffff#define mem(x) memset(x,0,sizeof(x))#define PI acos(-1)#define eps 1e-8using namespace std;ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}ll lcm(ll a,ll b){return a/gcd(a,b)*b;}ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}double dpow(double a,ll b){double ans=1.0;while(b){if(b%2)ans=ans*a;a=a*a;b/=2;}return ans;}//headint main(){    int t,cas=0;    scanf("%d",&t);    while(t--)    {        double x,y,L;        scanf("%lf%lf%lf",&x,&y,&L);        if(L==0.0)        {            printf("Case %d: %.7lf\n",++cas,max(x,y));            continue;        }        double l=0.0,r=max(x,y),mid;        //cout<<l<<" "<<r<<endl;        while(l<r)        {            mid=(l+r)/2.0;            double j1=acos(mid/x),j2=acos(mid/y);            double h=(mid*tan(j1)*tan(j2))/(tan(j1)+tan(j2));            //cout<<h<<" "<<mid<<endl;            if(fabs(h-L)<eps)                break;            if(h>L)                l=mid;            else                r=mid;        }        printf("Case %d: %.7lf\n",++cas,mid);    }    return 0;}
0 0
原创粉丝点击