并查集,这题挺简单,注意一下根据两点经纬度求两点距离的公式。
携程全球数据中心建设
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)
为了实现每个数据中心的数据能互通,数据中心之间需要通过光纤连接。为了节约光纤成本,我们计划采用点对点方式来达到最终各个数据中心的数据互通,每个数据中心本身都可以作为数据中转站。做为全球多数据中心设计者,您需要知道最短的光纤总长度,来把所有的数据中心都实现互通。假设地球是个圆球,且表面是平滑的,并且没有任何阻碍物(河流,山脉)。
输入数据是一组数据中心的经纬度
纬度: -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).
第一行,小数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
2 12742 5900 3 51.3 0 42.5 -75 48.8 3 12742 620 2 30.266 97.75 30.45 91.1333
Sample Output
Y N
Source
CodingTrip - 携程编程大赛 (预赛第一场)
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cmath>
#include <cstring>
#include <stdio.h>
#define pi 3.14159265358
using 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;
}