poj 2587 Airline Hub 数学题

题意:告诉你n个点的经纬度,求从一个点到其它点的最远的最小距离(能懂吧.)

居然是到数学题,学到了好多公式..

假设地球是球体, 
设地球上某点的经度为lambda,纬度为phi, 
则这点的空间坐标是 
x=cos(phi)*cos(lambda) 
y=cos(phi)*sin(lambda) 
z=sin(phi) 
设地球上两点的空间坐标分别为(x1,y1,z1),(x2,y2,z2) 
直线距离即为R*sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1)),
则它们的夹角为 A = acos(x1 * x2 + y1 * y2 + z1 * z2)
球面距离为 A*R/2(R 即地球半径)

View Code
 1 #include <stdio.h>
2 #include <math.h>
3
4 struct node{
5 double j,w,x,y,z,a,b;
6 }ar[1005];
7
8 const double PI=acos(-1.0);
9
10 double dis(node a,node b)
11 {
12 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));
13 }
14
15 int main()
16 {
17 int n,i,j,ans;
18 double len,max,min;
19 while (scanf("%d",&n)!=EOF)
20 {
21 for (i=0;i<n;i++)
22 {
23 scanf("%lf%lf",&ar[i].j,&ar[i].w);
24 ar[i].a=ar[i].j;
25 ar[i].b=ar[i].w;
26 ar[i].a*=PI/180;
27 ar[i].b*=PI/180;
28 ar[i].x=cos(ar[i].a)*cos(ar[i].b);
29 ar[i].y=cos(ar[i].a)*sin(ar[i].b);
30 ar[i].z=sin(ar[i].a);
31 }
32 min=0x3f3f3f3f;
33 for (i=0;i<n;i++)
34 {
35 max=0;
36 for (j=0;j<n;j++)
37 {
38 if(i==j)continue;
39 len=dis(ar[i],ar[j]);
40 if(len>max)max=len;
41 }
42 if(max<min)
43 {
44 min=max;
45 ans=i;
46 }
47 }
48 printf("%.2lf %.2lf\n",ar[ans].j,ar[ans].w);
49 }
50 return 0;
51 }
posted @ 2011-10-27 14:48  104_gogo  阅读(228)  评论(0编辑  收藏  举报