携程预赛_携程全球数据中心建设(最小生成树prim+计算几何)

来源:互联网 发布:女士内裤知乎 编辑:程序博客网 时间:2024/05/29 03:55

携程全球数据中心建设

Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 56   Accepted Submission(s) : 21

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

携程为了扩展全球在线旅游业务,决定在全球建设多数据中心,以便提高网站的访问速度和容灾处理。
为了实现每个数据中心的数据能互通,数据中心之间需要通过光纤连接。为了节约光纤成本,我们计划采用点对点方式来达到最终各个数据中心的数据互通,每个数据中心本身都可以作为数据中转站。做为全球多数据中心设计者,您需要知道最短的光纤总长度,来把所有的数据中心都实现互通。假设地球是个圆球,且表面是平滑的,并且没有任何阻碍物(河流,山脉)。

输入数据是一组数据中心的经纬度
纬度: -90° 到 +90°
经度: -180° 到 +180°
(圆周率pi= 3.14159265358979323846)

Input

第一行第一个整数N(1≤N≤100),表示有多少个用例. 每个用例包含了:
第一行,小数D(1≤D≤1,000,000),表面圆球的直径(公里).
第二行,小数L(1≤L≤1,000,000) 光纤总长度 (公里).
第三行,整数C(1≤C≤100) ,表示数据中心的数量.
接下来的C行, 每行有2个形如"X Y"的小数,表示每个数据中心的纬度(-90≤X≤90)和经度 (-180≤Y≤180).

Output

每个用例输出一行. 如果光纤长度L足够连接所有数据中心,输出"Y", 否则输出"N"。

Sample Input

2127425900351.3 042.5 -7548.8 312742620230.266 97.7530.45 91.1333

Sample Output

YN

Source

CodingTrip - 携程编程大赛 (预赛第一场) 

解题报告
裸最小生成树,唯一复杂就是求两地球坐标的距离
double dis(double x1,double y1,double x2,double y2,double d){    double y12;    if(fabs(y1-y2)>180)        y12=360-fabs(y1-y2);    else y12=fabs(y1-y2);    return d/2*acos(sin(x1*PI/180)*sin(x2*PI/180)+cos(x1*PI/180)*cos(x2*PI/180)*cos(y12*PI/180));}

接下去就是裸最小树
#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <stdlib.h>#include <math.h>#define inf 99999999#define PI 3.14159265358979323846using namespace std;double dis(double x1,double y1,double x2,double y2,double d){    double y12;    if(fabs(y1-y2)>180)        y12=360-fabs(y1-y2);    else y12=fabs(y1-y2);    return d/2*acos(sin(x1*PI/180)*sin(x2*PI/180)+cos(x1*PI/180)*cos(x2*PI/180)*cos(y12*PI/180));}struct nodes{    double x,y;}node[1000];int m,n;double mmap[110][110];double prim(){    int u,i,j;    double ans=0,minn=inf;    double dis[110];    int vis[110];    for(i=0;i<n;i++)    {        dis[i]=mmap[0][i];        vis[i]=0;    }    dis[0]=0;    vis[0]=1;    for(i=0;i<n-1;i++)    {        u=0;minn=inf;        for(j=1;j<=n;j++)        {            if(!vis[j]&&dis[j]<minn)            {                minn=dis[j];                u=j;            }        }        ans+=minn;        vis[u]=1;        for(j=1;j<=n;j++)        {            if(!vis[j]&&dis[j]>mmap[u][j])            {                dis[j]=mmap[u][j];            }        }    }    return ans;}int main(){    int t,i,j;    double d,l;    scanf("%d",&t);    while(t--)    {        scanf("%lf%lf%d",&d,&l,&n);        memset(node,0,sizeof(node));        memset(edge,0,sizeof(edge));        for(i=0;i<n;i++)        {            scanf("%lf%lf",&node[i].x,&node[i].y);        }        m=0;        for(i=0;i<n;i++)        {            for(j=0;j<n;j++)            {                mmap[i][j]=inf;            }            mmap[i][i]=0;        }        for(i=0;i<n;i++)        {            for(j=0;j<n;j++)            {                mmap[i][j]=mmap[j][i]=dis(node[i].x,node[i].y,node[j].x,node[j].y,d);            }        }        double ans=prim();        if(ans>l)            printf("N\n");        else printf("Y\n");    }    return 0;}



0 0
原创粉丝点击