2019 ACM-ICPC 西安邀请赛 C. Angel's Journey(数学几何)

【题目】

Angel's Journey

【题解】

题意:给定圆心rx,ry和半径r和终点位置x,y,Miyako位于圆的底部即(rx,ry-r),直线y=ry以下和圆外的部分是海,不能直接通过。输出Miyako从起点到终点的最短距离。

思路:画图,分类讨论即可。

【代码】

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double pi=acos(-1.0);
double rx,ry,r,x,y;
double s;
double len1(double a,double b,double c,double d)
{
    return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}
double len2(double a,double b,double c,double d,double rr)
{
    return sqrt((a-c)*(a-c)+(b-d)*(b-d)-rr*rr);
}
int main()
{
    int t; scanf("%d",&t);
    while(t--){
        scanf("%lf%lf%lf%lf%lf",&rx,&ry,&r,&x,&y);
        s=0;
        if(x<=rx-r)
            s=pi*r/2+len1(x,y,rx-r,ry);
        else if(x>=rx+r)
            s=pi*r/2+len1(x,y,rx+r,ry);
        else{
            double d1,d2,d3,sina,sinb,a,b;
            d1=len1(x,y,rx,ry);
            d2=len2(x,y,rx,ry,r);
            d3=len1(x,y,x,ry);
            sina=d2/d1;
            sinb=d3/d1;
            s=d2+(asin(sinb)-asin(sina))*r+pi*r/2;
        }
        printf("%.4f\n",s);
    }
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值