zstuoj 4243 牛吃草

来源:互联网 发布:阿里云通用储值卡 编辑:程序博客网 时间:2024/04/30 14:18


点击打开 题目 链接


一道数学题,

弧adc将圆分成两半。

牛吃的那一部分面积即为扇形BCDA+扇形OAC-三角形AOB+三角形COB。

扇形面积公式S=(l*r)/2;

已知 l 、r。

设 R;能表示出 牛吃的草的面积。

从0-1e5 二分逼近求R。

#include<bits/stdc++.h>using namespace std;const int maxn=1010;const double eps=1e-8;const double pi=acos(-1.0);int dsgn(double x){    return x<-eps?-1:x>eps;}double area(double r,double R,double l){    if(dsgn(l-R-r)>=0) return 0;    else if(dsgn(l-fabs(r-R)<=0)){        if(r>R) r=R;        return pi*r*r;    }    double a=acos((l*l+r*r-R*R)/(2.0*l*r));    double b=acos((l*l+R*R-r*r)/(2.0*l*R));    double s1=a*r*r;    double s2=b*R*R;    double s3=cos(a)*r*sin(a)*r;    double s4=cos(b)*R*sin(b)*R;    return s1+s2-s3-s4;}int main(){    int T;    double x0,y0,x1,y1,r;    scanf("%d",&T);    while(T--){        scanf("%lf%lf%lf%lf%lf",&x0,&y0,&x1,&y1,&r);        x1-=x0,y1-=y0;        double l=sqrt(x1*x1+y1*y1);        double lt=0,rt=1e5;        while(dsgn(rt-lt)>0){            double md=(rt+lt)/2.0;            if(dsgn(2.0*area(r,md,l)-pi*r*r)>=0) rt=md;            else lt=md;        }        printf("%.4lf\n",rt);    }return 0;}



0 0
原创粉丝点击