Get Off My Lawn! Kattis - garden

本文介绍了一道编程题的解决方案,该题要求计算狗链的最小长度以确保守卫区域面积达到指定值。文章给出了源代码,并详细解释了如何根据直线距离和不同条件下的面积计算公式来确定所需长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值