码迷,mamicode.com
首页 > 其他好文 > 详细

zstuoj 4243

时间:2017-01-30 20:20:41      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:return   algorithm   class   表示   limit   include   sub   div   sqrt   

牛吃草

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 441  Solved: 139

Description

农夫有一个长满草的(x0, y0)为圆心,r为半径的圆形牛栏,他要将一头牛栓在坐标(x1, y1)栏桩上,但只让牛吃到一半草,问栓牛鼻的绳子应为多长?

Input

输入一个T,表示T组测试数据
下面T行每行五个整数 x0, y0, x1, y1, r 所有数据的绝对值小于1e5

Output

每组测试数据输出绳子长度,保留4位小数

Sample Input

2
0 0 0 0 2
0 0 10 10 2

Sample Output

1.4142
14.1892
先计算公共面积,然后直接二分。
#include "cstdio"
#include "algorithm"
#include "cstring"
#include "cmath"
#define  inf 0x3f3f3f
using  namespace std;
double  pi=acos(-1);
double s0,s1,s2,s3,s4,d;
double  x0,x1,e,f,r;
int P(double l ){
    double a1=acos((d*d+r*r-l*l)/(2*d*r));
    double a2=acos((l*l+d*d-r*r)/(2*l*d));
    s0=r*r*a1+l*l*a2-d*r*sin(a1);//相交面积
    s4=pi*r*r/2;
    if(s0>s4){
        return  1;
    }
    return -1;
}
int main(){
    int t;
    scanf("%d",&t);
    while (t--){
        scanf("%lf%lf%lf%lf%lf",&x0,&e,&x1,&f,&r);
        d=sqrt((x0-x1)*(x0-x1)+(e-f)*(e-f));
        if(d<r*(1-sqrt(2)/2)){//判断内含情况
            printf("%.4f\n",r*sqrt(2)/2);
            continue;
        }
        double R=sqrt(r*r+d*d);
        double L=0;
        double M=(L+R)/2;
        for(int i=0;i<50;i++){
            if(P(M)>0){
                R=M;
            }
            else {
                L=M;
            }
            M=(L+R)/2;
        }
        printf("%.4f\n",M);
    }
    return 0;
}

 

 

 

zstuoj 4243

标签:return   algorithm   class   表示   limit   include   sub   div   sqrt   

原文地址:http://www.cnblogs.com/mj-liylho/p/6358294.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!