UVA 11817 - Tunnelling the Earth

题目大意:输入两个点的纬度跟经度,要求求出这两个点的直线距离跟从地球表面的距离的差值。

思路:利用高中的立体几何知识……

代码如下:

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cmath>
using namespace std;

const double pi=acos(-1);

int main(){
  //  freopen("data.txt","r",stdin);
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    double radius=6371009;
    while(T--){
        double x1,x2,y1,y2;
        cin>>x1>>y1>>x2>>y2;
        x1=x1/180*pi;
        x2=x2/180*pi;
        y1=y1/180*pi;
        y2=y2/180*pi;
        double r1=radius*sin(x1);
        double r2=radius*sin(x2);
        double BC=fabs(r1-r2);
        r1=radius*cos(x1);
        r2=radius*cos(x2);
        double ac2=r1*r1+r2*r2-2*r1*r2*cos(y1-y2);
        double AC=sqrt(ac2);
        double ab2=BC*BC+ac2;
       // cout<<ab2<<endl;
        double AB=sqrt(ab2);
        double arg=(radius*radius*2-ab2)/2/radius/radius;
     //   cout<<"zzzz"<<arg<<endl;
        arg=acos(arg);
        double c=radius*arg;
     //   cout<<arg<<' '<<c<<' '<<AB<<endl;
        double ans=c-AB;
        cout<<setiosflags(ios::fixed)<<setprecision(0)<<ans<<endl;
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值