NC15872. 经纬度
描述
输入描述
第一行一个整数T表示数据组数。
接下来n行,每行四个数lat1, lng1, lat2, lng2分别表示两个点的经纬度。
正数表示北纬和东经。
负数表示南纬和西经。
数据保证合法。
输出描述
n行表示答案。
答案保留到米。
示例1
输入:
1 43.466667 -80.516667 30.058056 31.228889
输出:
802333
C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 356K, 提交时间: 2018-05-04 20:09:25
#include<bits/stdc++.h> #define db double using namespace std; db r=6371009,p=acos(-1.0)/180.0; int main(){ int cas; scanf("%d",&cas); while(cas--){ db l1,d1,l2,d2; scanf("%lf%lf%lf%lf",&l1,&d1,&l2,&d2); l1*=p;l2*=p; d1*=p;d2*=p; db d=r*sqrt(2-2*(cos(l1)*cos(l2)*cos(d1-d2)+sin(l1)*sin(l2))); printf("%.0f\n",2*asin(d/2/r)*r-d); } return 0; }
Python3(3.5.2) 解法, 执行用时: 45ms, 内存消耗: 3448K, 提交时间: 2018-05-04 21:16:23
from math import * R = 6371009 t = int(input()) for tt in range(t): a, b, c, d = map(float,input().split()) a = (a/180)*pi b = (b/180)*pi c = (c/180)*pi d = (d/180)*pi ans = R*sqrt(2-2*(cos(a)*cos(c)*cos(b-d)+sin(a)*sin(c))) ans = round(2*asin(ans/(2*R))*R-ans) print(ans)