题目链接:https://vjudge.net/contest/173017#problem/E
题意:已知两个点确定一个无限长的直线(墙),狗链一端拴在原点,求狗链至少要多长能使守卫的面积大于等于L.
思路:当狗链小于等于原点到直线距离L1时,守卫面积为整圆. 大于L1时,守卫面积为扇形加三角形面积。
三角形面积公式: S=1/2*d*h(底*高*二分之一)
扇形面积公式:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
int main()
{
double l,x1,x2,y1,y2,l1,fl,p,a,b;
int r;
fl=30/asin(0.5); //利用30度角求角度/弧度,因为反三角函数得到的是弧度,为180/π
while(scanf("%lf%lf%lf%lf%lf",&l,&x1,&y1,&x2,&y2)==5){
if(x1==x2) //当斜率不存在时
l1=abs(x1);
else
l1=abs(x2*y1-x1*y2)/(sqrt(1+(y2-y1)*(y2-y1)/(x2-x1)/(x2-x1)));//l1为原点到直线距离
for(r=1;r<100;r++)
{
if(r<=l1)
{
if(PI*r*r>=l) //守卫面积为整圆时
break;
}
else
{
p=(180+fl*asin(l1/r)*2)/360; //p为扇形的角度/360°
if(l1*sqrt(r*r-l1*l1)/2+PI*r*r*p>=l) //三角形面积+扇形
break;
}
}
printf("%d\n",r);
}
return 0;
}