首页 > 代码库 > zstuoj 4243
zstuoj 4243
牛吃草
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。