uva 10180 Rope Crisis in Ropeland!

题目大意:

给你两个点,代表拔河的两只队伍的位置。有这样一个柱子,以原点为圆心,r为半径。那么拔河两只队伍拉的绳子很可能绕到柱子上,给你两个队伍的位置以及圆柱的半径,求拔河用绳子的最短长度。


分析:

注意两点在圆外。

#include <iostream>
#include <cstdio>
#include <cmath>
#define eps 1e-9
using namespace std;

int main()
{
    int N;
    double x1,x2,y1,y2,e2,f2,g2,r,A,ans;
    scanf("%d",&N);
    while(N--)
    {
        scanf("%lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&r);
        e2 = (x1-x2)*(x1-x2) +(y1-y2)*(y1-y2);
        f2 = x1*x1 + y1*y1;
        g2 = x2*x2 + y2*y2;
        A = fabs(acos((x1*x2+y2*y1)/sqrt(f2*g2))) - acos(r/sqrt(f2)) - acos(r/sqrt(g2));
        //printf("A = %lf\n",A);
        if(A>-eps) ans = A*r + sqrt(f2 - r*r) + sqrt(g2 - r*r);
        else
            ans = sqrt(e2);
        printf("%.3lf\n",ans);
    }
    return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值