蓝桥杯 Island Hopping Java代码
对于每个岛,将给出它的路由器的位置和居民数量。PIN将会在群岛中连接多条电缆,每条电缆连接两座岛的路由器,最后使得每座岛都通过一条电缆路径与核心岛屿相连。PIN希望总的电缆长度最小。这样也许会有多个最佳方案。PIN并不关心哪个最佳网络方案被采纳。
PIN对于新顾客连上互联网的平均时间很感兴趣,我们不妨假设:所有连接网络的电线都是同时开始建设的。电缆铺设效率为一千米每天。因此,短的电缆会比长的更快铺好。
当一座岛到核心岛屿的电缆连通时,这座岛就接入了互联网。PIN希望你告诉他所有居民连入互联网的平均时间。
输入数据最后以一个整数0结束。
每一个测试点输出后打印一个空行。
11 12 2500
14 17 1500
9 9 750
7 15 600
19 16 500
8 18 400
15 21 250
0
1 import java.util.Comparator;
2 import java.util.LinkedList;
3 import java.util.List;
4 import java.util.PriorityQueue;
5 import java.util.Queue;
6 import java.util.Scanner;
7
8
9 public class Main {
10
11 public static void main(String[] args) {
12
13 Scanner scanner=new Scanner(System.in);
14 int n=scanner.nextInt();
15 int k=0;//表示输出第几个结果
16 int ptotal=0;//总人数
17 double ave=0;//平均通网时间
18 List<Edge> resE=new LinkedList<Edge>();//保存n-1条边
19
20
21 Comparator<Edge> cEdge=new Comparator<Edge>() {//自定义比较器,用于用于队列的排序
22 public int compare(Edge e1,Edge e2) {
23 if(e1.dis>e2.dis) return 1;
24 if(e1.dis<e2.dis) return -1;
25 else return 0;
26 }
27 };
28
29
30 Queue<Edge> keep=new PriorityQueue<Edge>(cEdge);//用来存储于当前节点相关的所有的边,这里用了自定义的比较器,也就是按照边长度的升序排序
31
32
33 while(n!=0) {
34 //一开始所有数据初始化清零
35 resE.clear();
36 keep.clear();
37 k++;
38 ave=0;
39 ptotal=0;
40
41
42 boolean[]visit=new boolean[n];//用来记录节点是否被访问,以免重复访问
43 Position[]positions=new Position[n];//存储n个岛屿的信息
44 for(int i=0;i<n;i++) {//将输入的数据存储,连接时间一开始设为0
45 positions[i]=new Position(scanner.nextInt(),scanner.nextInt(),scanner.nextInt(),0);
46 ptotal+=positions[i].pnum;//计算总人数,用于之后的算平均时间
47 }
48 visit[0]=true;//因为第一个点是核心岛屿,一定最先访问,将它设置为true
49
50
51 for(int i=1;i<n;i++) {//将与当前岛屿相关联的边全部保存到keep中
52 double x2=Math.pow(positions[0].x-positions[i].x,2);
53 double y2=Math.pow(positions[0].y-positions[i].y, 2);
54 keep.add(new Edge(0,i, Math.sqrt(x2+y2)));
55 }
56 while(!keep.isEmpty()&&resE.size()!=n-1) {//当已将找到了n-1条边时,退出循环
57 Edge e1=keep.poll();//弹出队列的队首元素,因为是按照dis的升序排序的,所以队首元素对应的dis一定是最小的
58 if(visit[e1.to]==true)//如果该节点被访问过,重新取队首元素
59 continue;
60
61 resE.add(e1);//将这条边加入到储存边的链表中
62 visit[e1.to]=true;
63
64 for(int i=1;i<n;i++) {//以这条边的终点为起点,在keep中加入所有与终点相关联的边
65 if(visit[i]==false) {//这个点一定是没有访问过的
66 double x2=Math.pow(positions[e1.to].x-positions[i].x, 2);
67 double y2=Math.pow(positions[e1.to].y-positions[i].y, 2);
68 keep.add(new Edge(e1.to, i, Math.sqrt(x2+y2)));
69 }
70 }
71
72
73 }
74 for(int i=0;i<resE.size();i++) {//依次比较两岛屿的连接时间与上一岛屿通网时间(因为resE中的元素是从核心岛屿出发向外扩散的,所以上一岛屿的通网时间一定是一个确定值)
75 Edge now=resE.get(i);
76 if(now.dis>positions[now.from].time)//如果走完当前边的时间大于这条边起点的通电时间,那么这条边终点的最早通电时间为前者
77 positions[now.to].time=now.dis;
78 else
79 positions[now.to].time=positions[now.from].time;
80
81 }
82
83 for(int i=1;i<n;i++) {
84 ave+=positions[i].time/ptotal*positions[i].pnum;//先除再乘,防溢出
85 }
86 System.out.print("Island Group: "+k+" Average ");
87 System.out.println(String.format( "%.2f",ave));
88 System.out.println("");
89 n=scanner.nextInt();
90 }
91
92
93 }
94
95
96 }
97 class Position{//岛屿信息
98 int x,y;//坐标
99 int pnum;//人数
100 double time;//通网时间
101 public Position(int x,int y,int pnum,double time) {
102 this.x=x;
103 this.y=y;
104 this.pnum=pnum;
105 this.time=time;
106 }
107 }
108
109 class Edge {//边信息
110 int from,to;//起点终点
111 double dis;//两点距离(也可以表示两点连接所用的时间,因为铺设效率是1Km/天)
112 public Edge(int from,int to,double dis) {
113 this.from=from;
114 this.to=to;
115 this.dis=dis;
116 }
117
118 }
蓝桥杯 Island Hopping Java代码的更多相关文章
- 取球游戏_nyoj_518(博弈-蓝桥杯原题).java
取球游戏 时间限制: 1000 ms | 内存限制: 65535 KB 难度: 2 描述 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下 ...
- 蓝桥杯算法训练 java算法 表达式求值
问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...
- 记 2019蓝桥杯校内预选赛(JAVA组) 赛后总结
引言 好像博客好久没更新了 哈哈哈哈哈 趁现在有空更新一波 不知道还有没有人看 确实该记录一下每天做了什么了 不然感觉有些浑浑噩噩了 比赛介绍 全称: 蓝桥杯全国软件和信息技术专业人才大赛 蓝桥杯 实 ...
- 蓝桥杯-四平方和-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- 蓝桥杯- 移动距离-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- 蓝桥杯-密码发生器-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- 蓝桥杯-括号问题-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- 蓝桥杯-扑克牌移动-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- 蓝桥杯-放麦子-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
随机推荐
- python的学习准备工作
python是开放的的语言,可以从官方网站下载www.python.org 下载下来后直接运行安装就行了 ctrl+n新建一个文件 ctrl+s保存,以.py为扩展名 点run module 或者F5 ...
- HashTable学习
HashTable虽然加上了线程安全,但是源码走向和思想比hashMap还是要简单直白很多,hashmap还得再看,因为很多关键点没有get,下午&明天自己去debug一遍再继续看看博客 脑子 ...
- Docker之概述
我们常常需要将应用程序部署在独立的系统环境中,而使用物理机器部署会浪费大量的物理资源.能否讲物理机器虚拟成一个一个容器,而将程序部署在各自的容器中?Docker是一个能够把开发的应用程序自动部署到容器 ...
- C#开发PACS医学影像三维重建(一):使用VTK重建3D影像
VTK简介: VTK是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的. 因为使用C#语言开发,而VTK是C++ ...
- Module build failed: TypeError: this.getResolve is not a function at Object.loader 使用vue-cli 创建项目 使用sass时报错 -- 等其他sass 报错 ./node_modules/css-loader?{"sourceMap":true}!./node_modules/vue-loader/lib
已经安装了 sass相关依赖包 npm install sass-loader --save-devnpm install node-sass --sava-dev 并且在build文件下webpa ...
- 深入理解HDFS分布式文件系统
深入理解HDFS:Hadoop分布式文件系统: https://blog.csdn.net/bingduanlbd/article/details/51914550
- 使用Navicat连接MySQL8.0版本报1251错误
出现1251错误是因为,MySQL8.0版本改变了密码的验证规则caching_sha2_password,MySQL之前的版本验证规则是mysql_native_password,现在需要修改MyS ...
- dedecmsv5.7sp1远程文件包含漏洞审计
dedecms5.7 sp1版本存在远程文件包含漏洞,在此记录审计复现漏洞过程. 漏洞在/install/index.php(index.php.bak)文件中,漏洞起因是$$符号使用不当,导致变量覆 ...
- Unicode、UTF8、GB2312、ANSI
来源:https://blog.csdn.net/osanwenyu/article/details/48439461 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原 ...
- 9.23 T1 tree
题意描述: 给你一个长度为 \(n\) 的序列,让你从中选出 \(k\) 个数组成一个集合,定义这个集合的极限高度为\(a_i...a_k\) 的最大值. 让你求所有的集合极限高度 之和对 \(100 ...