Get Off My Lawn! Kattis

来源:互联网 发布:mac上有什么好玩的游戏 编辑:程序博客网 时间:2024/06/03 16:24

题目链接: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;}


原创粉丝点击