蓝桥杯:通电
蓝桥杯: 通电https://www.lanqiao.cn/problems/162/learning/
目录
题目描述
输入描述
输出描述
输入输出样例
输入
输出
题目分析(最小生成树):
AC代码(Java)
题目描述
2015 年,全中国实现了户户通电。作为一名电力建设者,小明正在帮助一带一路上的国家通电。
这一次,小明要帮助 n 个村庄通电,其中 1 号村庄正好可以建立一个发电站,所发的电足够所有村庄使用。
现在,这 n 个村庄之间都没有电线相连,小明主要要做的是架设电线连接这些村庄,使得所有村庄都直接或间接的与发电站相通。
小明测量了所有村庄的位置(坐标)和高度,如果要连接两个村庄,小明需要花费两个村庄之间的坐标距离加上高度差的平方,形式化描述为坐标为(x1,y1) 高度为 ℎ1 的村庄与坐标为 (x2,y2) 高度为 ℎ2 的村庄之间连接的费用为
高度的计算方式与横纵坐标的计算方式不同。
由于经费有限,请帮助小明计算他至少要花费多少费用才能使这 n 个村庄都通电。
输入描述
输入的第一行包含一个整数 n ,表示村庄的数量。
接下来 n 行,每个三个整数 x,y,h,分别表示一个村庄的横、纵坐标和高度,其中第一个村庄可以建立发电站。
其中,1≤n≤1000,0≤x,y,h≤10000。
输出描述
输出一行,包含一个实数,四舍五入保留 2 位小数,表示答案。
输入输出样例
输入
4
1 1 3
9 9 7
8 8 6
4 5 4
输出
17.41
题目分析(最小生成树):
把村庄看成顶点,求每个村庄之间搭建电线的花费最少,也就是每个顶点直接相连所需要的花费最少,很明显是考最小生成树。
如果不了解最小生成树,可以先看:蓝桥杯:聪明的猴子。这个题是最小生成树的模板题。
题目有个附加条件,就是1号村庄是有发电站的,并且其他村庄想要有电,要么直接从1号村庄建立电线,要么和已经与1号村庄建立电线的村庄来建立电线,如:
假如2号村庄已经同1号村庄架设了电线,那么此时1号村庄和2号村庄都是通电的,也就是说,3号村庄与1号村庄、2号村庄搭设电线,他都能通电,因此,我们只需要根据最小生成树的贪心策略(每次选择花费最小的一条边进行连接),即可完成所有村庄的通电。
因为最小生成树是用最小花费建立一个连接所有顶点的图,那么,也就是1号村庄是肯定会被连接的,我们不需要对1号村庄进行特殊处理,直接套用最小生成树的模板即可(因此本题也是一个最小生成树的模板题)。
PS:注意,建立边的花费是浮点数。
AC代码(Java)
在写优先队列的升序排序的时候,记得题目中的代价(也可以叫做建立边的花费,这里用price来表示)是浮点数的,所以要用对应的包装类的比较方法compare(),我当成整型来处理,写成了(int)e1.price-e2.price,最后一个用例没过。
应该是用Double的compare方法来比较两个price。
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {//并查集模板static int[] pre;public static void initPre(int n){pre = new int[n+5];for(int i = 1;i<=n;i++)pre[i] = i;}public static int find(int x) {if(pre[x] == x) return x;return pre[x] = find(pre[x]);}public static void join(int a,int b) {pre[find(a)] = pre[find(b)];}//存储村庄的坐标信息static class Point{int id; //村庄编号,唯一标识int x; //x轴int y; //y轴int h; //高public Point(int id,int x,int y,int h) {this.id = id;this.x = x;this.y = y;this.h = h;}}//两个村庄之间建立边static class Edge{//self和target建立边(架设电线)Point self;Point target;double price; //建立边的花费public Edge(Point self,Point target,double price) {this.self = self;this.target = target;this.price = price;}}public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt(); //村庄编号initPre(n);//建立一个列表存放村庄信息List<Point> list = new ArrayList<>();for(int i = 1;i<=n;i++){int x = scan.nextInt();int y = scan.nextInt();int h = scan.nextInt();list.add(new Point(i,x,y,h));}scan.close();//将所有村庄之间架设电线(建边)的信息存放到优先队列之中,按照升序排序//(PS:这里使用Double的compare来比较大小,如果直接用(int)e1.price-e2.price,将比较结果转换成(int),最后一个用例有错),Debug了一个小时.....PriorityQueue<Edge> pq = new PriorityQueue<>((e1,e2)->((Double.compare(e1.price,e2.price))));for(int i = 1;i<n;i++){//编号为i的村庄存放在列表的i-1处Point self = list.get(i-1);for(int j = i+1;j<=n;j++){Point target = list.get(j-1);//计算他们之间的花费double x = Math.pow(self.x-target.x,2); //(x1-x2)^2double y = Math.pow(self.y-target.y,2); //(y1-y2)^2double h = Math.pow(self.h-target.h,2); //(h1-h2)^2double price = Math.sqrt(x+y) + h; //对x+y开根号 + h//放入优先队列之中pq.add(new Edge(self,target,price));}}//收集完全部边的信息之后,每次取出花费最小的一条边建立边int e = 0; //对于一个顶点为n的图,最短路径应该是n-1条边double ans = 0;while(!pq.isEmpty()) {Edge edge = pq.poll();Point self = edge.self;Point target = edge.target;//判断建立这条边是否会产生环,如果会,就跳过if(find(self.id) == find(target.id)) {continue;}//如果不会产生环,那么就建立这条边,同时记录花费join(self.id,target.id);ans += edge.price;e++;if(e == n-1) break;}//格式化输出,保留两位小数System.out.printf("%.2f",ans);}
}
相关文章:

蓝桥杯:通电
蓝桥杯: 通电https://www.lanqiao.cn/problems/162/learning/ 目录 题目描述 输入描述 输出描述 输入输出样例 输入 输出 题目分析(最小生成树): AC代码(Java) 题目描述 2015 年,全中国实现了户户通电。作为一名电力建设者࿰…...

一文搞懂 Kubernetes 的 Limits 和 Requests
当在Kubernetes中使用容器时,重要的是要知道所涉及的资源是什么以及如何需要它们。有些进程比其他进程需要更多的CPU或内存。有些是关键的,不应该被饿死。知道了这一点,我们应该正确配置我们的容器和Pod,以获得两者的最佳效果。在…...

【C++】手撕红黑树
文章目录前言一、红黑树的概念二、红黑树的节点结构三、红黑树的插入四、红黑树的调整1、叔叔存在且为红2、叔叔不存在或存在且为黑3、插入完整代码4、总结五、红黑树的验证六、红黑树的删除七、红黑树与 AVL 树的比较八、红黑树的代码实现前言 在网络上流传着这样一张图片&am…...

Java中的CAS实现原理
文章目录一、什么是CAS?二、JAVA中如何实现CAS操作三、CAS在JUC中的运用四、ABA问题一、什么是CAS? 在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行…...

什么是华为云对象存储OBS?它有什么优势?
华为对象存储OBS(Object Storage Service)是一种高可用、高可靠、高性能的云存储服务,能够为企业和个人用户提供强大的数据存储和管理功能。本文将对华为对象存储OBS的特点、优势和未来发展进行详细介绍。 一、华为对象存储OBS的特点 1.对象…...

你知道照片怎么变清晰吗?增强照片清晰度的方法
相信很多小伙伴都会有这种的经历,去游玩时高高兴兴的拍照留念,结果拍出来的照片不是很尽人意。或者是画面还没聚焦好,就按下快门,导致拍摄出来的照片变模糊了。很多小伙伴遇到这种情况都很烦恼,照片丢了可惜࿰…...
NOIP模拟赛 轰炸(bomb)
题目描述 有nnn座城市,城市之间建立了mmm条有向的地下通道。 你需要发起若干轮轰炸,每轮可以轰炸任意多的城市。但在每次轰炸城市中,不能同时存在两个城市i,ji,ji,j满足可以通过地下通道从城市iii到达城市jjj。你需要求出最少需要多少轮可以…...
Linux系统之安装PHP环境
Linux系统之安装PHP环境 一、PHP介绍1.PHP简介2.PHP优势3.php7版本特点二、本地环境介绍1.环境规划2.检查操作系统版本3.检查当前yum仓库三、安装PHP5.4版本1.查看可安装php版本2.使用yum安装php3.安装httpd服务4.关闭selinux和设置防火墙5.编辑index.php测试文件6.测试php环境…...

MySQL8的安装教程
MySQL8的安装教程 1.安装包的下载 如果不想去官网下载的话可以去百度网盘进行下载。 MySQL :: Download MySQL Community Server mysql-8.0.28-winx64.zip_免费高速下载|百度网盘-分享无限制 (baidu.com) 提取码:0001 2.解压 3.创建一个my.ini的文件 最好是创建…...

日入500+的程序员都在用的“接私活”平台
网上总说程序员的薪资很高,这我可就不同意了: 程序员的薪资哪里是很高,而是非常高!而会接私活的程序员更是能拿到更高的收入!作为一个程序员,这些接私活的网站一定要收藏起来,让你在“八小时外…...

MySQL表设计思路(一对多、多对多...)
要开始单独负责需求了,捋一捋表设计的思路。 文章目录一、MySQL中的数据类型二、一对一的关系设计二、一对多的关系设计三、多对多的关系设计四、经验总结一、MySQL中的数据类型 字符串类型 varchar:即variable char ,可边长度的字符串&#…...
内存对齐:C/C++编程中的重要性和技巧
C/C中的内存对齐前言基本概念 什么是内存对齐?内存对齐的定义内存对齐的作用数据类型的大小ARM 64 位架构和 x86_64 架构下的数据类型大小ARM 32 位架构下的数据类型大小内存对齐的边界填充字节的作用内存对齐的原理结构体中的内存对齐结构体的定义和使用结构体中成…...
C++ Primer第五版_第七章习题答案(41~50)
文章目录练习7.411、头文件2、源文件3、主函数练习7.42练习7.43练习7.44练习7.45练习7.46练习7.47练习7.48练习7.49练习7.50练习7.41 使用委托构造函数重新编写你的Sales_data 类,给每个构造函数体添加一条语句,令其一旦执行就打印一条信息。用各种可能的…...
python玄阶斗技--NumPy入门
目录 一.NumPy介绍 二.创建数组 1.一维数组创建 2.二维数组创建 3.zeros函数 4.ones函数 5.empty函数 6.arange函数 三.NumPy的数学操作 1.基本运算 2.矩阵运算 3.ndarray类的方法 四.数组堆叠 五.数组分隔 一.NumPy介绍 在这里对NumPy的介绍我不想扯太多…...

VR黑科技丨远离拥挤,VR直播开启沉浸式赏樱新姿势
春光兮婉转,珞樱兮盛绽,又是一年樱花季,全国各地大部分地区的樱花进入盛花期,尤其是武汉,东湖樱园踏青赏花的游人如织、摩肩擦踵,勾勒一幅“人人人人人人人花人人人人人”的盛景。 为了一睹樱花“芳容”&am…...
ts的一些用法
1.交叉类型 & ---多个类型属性的集合 1.1类型别名实现 type Person {name:string} type Children Person & {age:number} let newPerson:Children {// name:hahah,name:hhaah,age:18 } 1.2 接口类型实现 interface Inter1{name:string } interface Inter2{name:…...
云计算面试总结
shell脚本对日志进行备份 shell 对日志备份 #!/bin/bash if [ -d /log/bak/ ] || mkdir -p /log/bak/ thentar Pcf /log/bak/log_$(date %Y%m%d)$(date %H%M%S).tar.gz /var/log/*.logecho "干完!可以约会啦" fi存在的问题: 说的太快&a…...
(DP)买不到的数目【蓝桥杯】(裴蜀定理)
买不到的数目 小明开了一家糖果店。 他别出心裁:把水果糖包成4颗一包和7颗一包的两种。 糖果不能拆包卖。 小朋友来买糖的时候,他就用这两种包装来组合。 当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。 你可以用计算机测试一下&#…...
Docker使用DockerFile部署Go项目
Docker使用DockerFile部署Go项目1. 文章说明2. Go项目打包到Linux2.1 学习链接与知识点2.2. 打包生成 main 文件2.3 Docker部署Go项目1. 文章说明 目的:将打包生成的 main 文件,在Docker里面,使用Dockerfile文件,生成镜像与容器&…...
C++ Primer第五版_第七章习题答案(31~40)
文章目录练习7.31练习7.32练习7.33练习7.34练习7.35练习7.36练习7.37练习7.38练习7.29练习7.40练习7.31 定义一对类X 和Y,其中X 包含一个指向 Y 的指针,而Y 包含一个类型为 X 的对象。 class Y;class X{Y* y nullptr; };class Y{X x; };练习7.32 定义你…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...