携程编程赛第一场C题(球面最小生成树)
来源:互联网 发布:windows经典主题图片 编辑:程序博客网 时间:2024/06/06 05:17
题意:球面上给出n个点的经纬度,求最小生成树总路径长度是否小于给定的一个长度;
解法:球面上的最小生成树,关键是有两点的经纬度得到两点的球面距离:
球面距离公式:length=R*acos(cosβ1*cosβ2*cos(α1-α2)+sinβ1*sinβ2),β1,β2分别为纬度,α1,α2分别为经度;
代码:
/***************************************************** author:xiefubao*******************************************************/#pragma comment(linker, "/STACK:102400000,102400000")#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <queue>#include <vector>#include <algorithm>#include <cmath>#include <map>#include <set>#include <stack>#include <string.h>using namespace std;#define eps 1e-8double pi=acos(-1);typedef long long LL;int parent[110];int getparent(int k){ if(parent[k]==k) return k; return parent[k]=getparent(parent[k]);}struct p{ double x,y;} ps[110];struct point{ int a,b; double length;} points[100100];int p=0;bool operator<(point a,point b){ return a.length<b.length;}double R,L;int C;bool OK(int a,int b){ int ta=getparent(a); int tb=getparent(b); if(ta==tb) return false; parent[ta]=tb; return true;}int main(){ int t;cin>>t; while(t--) { scanf("%lf%lf%d",&R,&L,&C);R/=2; p=0; for(int i=0;i<C;i++) { scanf("%lf%lf",&ps[i].x,&ps[i].y); parent[i]=i; } for(int i=0;i<C;i++) for(int j=i+1;j<C;j++) { double x1=ps[i].x/180*pi; double x2=ps[j].x/180*pi; double y1=ps[i].y/180*pi; double y2=ps[j].y/180*pi; points[p].a=i,points[p].b=j; double tool=abs(y1-y2); if(tool>pi) tool-=pi; points[p++].length=R*acos(cos(x1)*cos(x2)*cos(tool)+sin(x1)*sin(x2)); } sort(points,points+p); double sum=0; for(int i=0;i<p;i++) { if(OK(points[i].a,points[i].b)) sum+=points[i].length; } if(sum<=L) cout<<"Y\n"; else cout<<"N\n"; } return 0;}/*R*arccos(cosx1*cosx2*cos(y1-y2)+sinx1*sinx2); */
0 0
- 携程编程赛第一场C题(球面最小生成树)
- 携程第一场 第三题 携程全球数据中心建设 (最小生成树 经纬度距离)
- 携程初赛 携程全球数据中心建设 球面上两点的最短距离 + 最小生成树
- hdu5723 Abandoned country(最小生成树+期望)(2016多校第一场A题)
- HDU5723(2016多校第一场)——Abandoned country(最小生成树+dfs)
- CodingTrip - 携程编程大赛 (预赛第一场)
- CodingTrip - 携程编程大赛 (预赛第一场)
- 携程编程大赛 (预赛第一场)
- CodingTrip - 携程编程大赛 (预赛第一场)
- 携程预赛第一场第一题
- CodingTrip - 携程编程大赛 (预赛第一场)第三题 携程全球数据中心建设
- CodingTrip - 携程编程大赛 (预赛第一场)第四题
- CodingTrip - 携程编程大赛 (预赛第一场)第二题 括号匹配
- 携程编程大赛 (预赛第二场)第一题【剪刀石头布】
- 2016 多校第一场 hdu 5723(最小生成树+dfs)
- HDU 5723 2016多校赛第一场 最小生成树+记忆化搜索
- 最小生成树+树上期望_____Abandoned country(hdu 5723 2016多校第一场)
- 组队赛第四场:最小生成树变形
- 网站栏目应该如何选择
- canvas-简单的线条来回扫描
- Seasar2を使う時log4j.propertiesファイル設定
- vs2010运行LGUI的问题
- 起风了,唯有努力生存
- 携程编程赛第一场C题(球面最小生成树)
- 携程编程预选赛 B题 括号匹配
- 图解Ubuntu 12.04设置wifi无线热点
- Java-基础知识2
- java.lang.NoClassDefFoundError: org/apache/log4j/Level
- const用法详解
- JS新API标准 地理定位(navigator.geolocation)基于Html5的位置定位
- Linux tar打包命令
- JVM调优总结