携程全球数据中心建设(并查集)

来源:互联网 发布:nfcs网络金融征信系统 编辑:程序博客网 时间:2024/05/21 09:29

并查集,这题挺简单,注意一下根据两点经纬度求两点距离的公式。

携程全球数据中心建设

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

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 - 携程编程大赛 (预赛第一场)

#include <iostream>#include <algorithm>#include <iomanip>#include <cmath>#include <cstring>#include <stdio.h>#define pi 3.14159265358using namespace std;const int MAX_M = 100 + 10;const int MAX_N  = (MAX_M * (MAX_M - 1)) >> 1;double w[MAX_N];int u[MAX_N],v[MAX_N],p[MAX_M],r[MAX_N];struct Point{    double x,y;};Point point[MAX_M];int cmp(int i,int j){    return w[i] < w[j];}int _find(int x){    return x == p[x] ? x : (p[x] = _find(p[x]));}double rr;double dis(double x1,double y1,double x2,double y2){    x1 = x1 * pi / 180.0;    x2 = x2 * pi / 180.0;    y1 = y1 * pi / 180.0;    y2 = y2* pi / 180.0;    return rr * acos(sin(x1) * sin(x2) + cos(x1) * cos(x2) * cos(y1 - y2));}int C,T;double ans;int main(){    cin >> T;    while(T--)    {        cin >> rr;        rr = rr / 2.0;        double l;        cin >> l;        ans = 0.0;        cin >> C;        for(int i = 1;i <= C;i++)        {            p[i] = i;            cin >> point[i].x >> point[i].y;        }        int cnt = 1;        for(int i = 1;i <= C;i++)        {            for(int j = i + 1;j <= C;j++)            {                u[cnt] = i;                v[cnt] = j;                w[cnt] = dis(point[i].x,point[i].y,point[j].x,point[j].y);                r[cnt] = cnt;                cnt++;            }        }        sort(r + 1,r + cnt,cmp);        int a, b;        for(int i = 1;i < cnt;i++)        {            a = _find(u[r[i]]);            b = _find(v[r[i]]);            if(a != b)            {                p[a] = b;                ans += w[r[i]];            }        }        if(ans <= l)            cout << "Y" << endl;        else            cout << "N" << endl;    }    return 0;}


0 0
原创粉丝点击