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

本文探讨了携程在全球范围内建设数据中心时如何通过最小生成树算法规划光纤网络,以确保所有数据中心间数据互通的同时,尽可能节约光纤成本。文章详细介绍了输入数据格式、算法实现过程以及如何验证光纤总长度是否满足连接需求。


携程全球数据中心建设

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 725    Accepted Submission(s): 307


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
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

给你 C个地球上的点,给你他们的经纬度 , 求一下他们的MST,检验是否在 给定的限制长度内。

把这个题目记录下来 主要是因为  自己半天没有推算出来 给定两点的 经纬度 和地球半径 求两点间的弧的长度或者 夹角 的 公式。。就在网上找了下。。

剩下的就是最小生成树的 套用了。

CODE:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
using namespace std;
#define INF 1000000000
#define PI acos(-1.0)
#define N 105
int n,c,ss,par[N];
double d,l;
struct node
{
	double x,y;
	int id;
}point[N];
struct no
{
	int u,v;
	double w;
}edge[N*N];
int cmp(no a,no b)
{
	return a.w<b.w;
}
int fi(int x)
{
	if(x!=par[x]) par[x]=fi(par[x]);
	return par[x];
}
double rad(double x)
{
	return x*PI/180.0;
}
double kru()
{
	double ret=0;
	int cou=0;
	for(int i=1;i<=ss;i++)
	{
		int u=edge[i].u;
		int v=edge[i].v;
		int x=fi(u);
		int y=fi(v);
		if(x!=y)
		{
			par[y]=x;
			cou++;
			ret+=edge[i].w;
			if(cou>=c-1) return ret;
		}
	}
	return INF;
}
double get_dis(double x1,double y1,double x2,double y2)
{
	double radx1=rad(x1);
	double radx2=rad(x2);
	double a=radx1-radx2;
	double b=rad(y1)-rad(y2);
	double ret=2*asin(sqrt(sin(a/2)*sin(a/2) + cos(radx1)*cos(radx2)*sin(b/2)*sin(b/2)));
	return d*ret/2.0;
}
int main()
{
	scanf("%d",&n);
	while(n--)
	{
		scanf("%lf",&d);
		scanf("%lf",&l);
		scanf("%d",&c);
		for(int i=1;i<=c;i++)
		{
			scanf("%lf%lf",&point[i].x,&point[i].y);
			point[i].id=i;
		}
		ss=0;
		for(int i=0;i<=c;i++) par[i]=i;
		for(int i=1;i<=c;i++)
		{
			for(int j=i+1;j<=c;j++)
			{
				double tmp=get_dis(point[i].x,point[i].y,point[j].x,point[j].y);
				edge[++ss].w=tmp;
				edge[ss].u=i; edge[ss].v=j;
			}
		}
		sort(edge+1,edge+1+ss,cmp);
		double ans=kru();
		if(ans<=l) puts("Y");
		else puts("N");
	}
    return 0;
}


### 关于软考系统架构设计师的信息 #### 软考系统架构设计师考试内容 全国计算机技术与软件专业技术资格(水平)考试中的系统架构设计师属于高级资格考试。该考试主要测试考生对于信息系统架构设计的理解和应用能力,包括但不限于以下几个方面[^1]: - **需求分析**:能够理解业务需求并将其转化为系统的功能和技术需求。 - **架构设计**:掌握多种架构模式及其适用场景;能根据具体的应用环境选择合适的体系结构来构建高效稳定的信息系统。 - **性能优化**:具备评估现有系统性能瓶颈的能力,并采取有效措施提高效率降低延迟。 - **安全机制**:熟悉常见的信息安全威胁以及防护手段,在设计方案时充分考虑安全性因素。 #### 推荐备考资料 为了更好地准备这项认证考试,建议参考以下资源进行学习和复习: - 官方指定教材《系统分析师教程》由清华大学出版社出版,全面覆盖了理论知识点; - 参加官方授权培训机构举办的培训班可以获得更专业的指导和支持; - 利用在线平台如中国计算机职业资格网提供的模拟试题库练习历年真题加深印象巩固所学知识。 #### 携程相关职位要求 以携程为例,作为一家大型互联网旅游服务提供商,其对应聘者担任系统架构师岗位通常会有如下期望: - 至少拥有五年以上Java开发经验,精通Spring Cloud微服务体系下的分布式事务处理方法论; - 对主流数据库管理系统MySQL有深入了解,可以独立完成复杂查询语句编写及索引调优工作; - 熟悉Linux操作系统命令行操作技巧,能够在生产环境中快速定位解决问题; - 具备良好的沟通表达能力和团队协作精神,善于倾听他人意见共同进步成长。 ```java // 示例代码展示了一个简单的RESTful API接口实现方式 @RestController @RequestMapping("/api/v1/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public ResponseEntity<User> getUserById(@PathVariable Long id){ Optional<User> userOptional = userService.findById(id); return userOptional.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值