华为机试:服务器广播
【编程题目 | 200分】服务器广播 [ 200 / 困难 ]
服务器广播
题目描述:
服务器连接方式包括直接相连,间接连接。A 和 B 直接连接,B 和 C 直接连接,则 A 和 C 间接连接。直接连接和间接连接都可以发送广播。
- 给出一个 N*N 数组,代表 N 个服务器,matrix[i][j]==1,则代表 i 和 j 直接连接;
- 不等于 1 时,代表 i 和 j 不直接连接。
- matrix[i][i]==1,即自己和自己直接连接。matrix[i][j]==matrix[j][i]。
计算初始需要给几台服务器广播,才可以使每个服务器都收到广播。
输入描述
输入为N行,每行有N个数字,为0或1,由空格分隔,构成N*N的数组,N的范围为 1<=N<=50
输出描述
输出一个数字,为需要广播的服务器数量
示例 1:
输入
1 0 0
0 1 0
0 0 1
输出
3
说明
3台服务器互不连接,所以需要分别广播这3台服务器
示例 1:
输入
1 1
1 1
输出
1
说明
2台服务器相互连接,所以只需要广播其中一台服务器
思路分析:
- 从第一个开始判断,依次将直连的服务器加进来
- 从1找到的集合中依次将直连的服务器加进来,直到集合没有变化
- 获取1集合中不存在的服务器,重复以上步骤
- 上述集合的个数,就是需要发出广播的服务器数量
参考代码
Java代码实现:
import java.util.*;public class ServiceBroadcast {public static void main(String[] args) {Scanner in = new Scanner(System.in);while (in.hasNext()) {String[] str = in.nextLine().split(" ");List<Integer> list = new ArrayList<>();for (int i = 0; i < str.length; i++) { // 把第一行加入listlist.add(Integer.parseInt(str[i]));}for (int i = 0; i < str.length - 1; i++) { // 把剩下的行都加入listString[] s = in.nextLine().split(" ");for (int j = 0; j < s.length; j++) {list.add(Integer.parseInt(s[j]));}}int N = str.length;List<List<Integer>> res = new ArrayList<>(); // 存储需要广播的服务器for (int i = 0; i < N; i++) { // 每一行if (isContainer(res, i)) { // 判断某个服务器是否已经存在其连通的服务器集合中continue;}List<Integer> newList = new ArrayList<>();newList.add(i);int lastLength = 0;while (lastLength != newList.size()) { // 判断当前集合可以联通的服务器for (int k = 0; k < newList.size(); k++) {int x = newList.get(k);for (int j = 0; j < N; j++) {int index = x * (N) + j; // 找到在对应list的索引if (list.get(index).equals(1)) {if (!newList.contains(j)) {newList.add(j);}}}}lastLength = newList.size();}res.add(newList);}System.out.println(res.size());}}public static Boolean isContainer(List<List<Integer>> res, int x) {for (List<Integer> integers : res) {if (integers.contains(x)) {return true;}}return false;}
}
dfs:
参考下面评论区的回溯dfs代码:
import java.util.*;public class ServiceBroadcast_dfs {public static int count = 0;public static void main(String[] args) {Scanner in = new Scanner(System.in);String[] str = in.nextLine().split(" ");int n = str.length;int[][] arr = new int[n][n];for(int i = 0; i < n; i++) { // 把第一行加入arrarr[0][i] = Integer.parseInt(str[i]);}for(int i = 1; i < n; i++) { // 把剩下的行加入arrString[] s = in.nextLine().split(" ");for(int j = 0; j < n; j++) {arr[i][j] = Integer.parseInt(s[j]);}}boolean[] visited = new boolean[n];for(int i = 0; i < n; i++) {if(!visited[i]) {dfs(arr, visited, i);}}System.out.println(count);}public static void dfs(int[][] arr, boolean[] visited, int index) {visited[index] = true;boolean flag = true;for (int i = index + 1; i < arr.length; i++) {if (arr[index][i] == 1) {flag = false;dfs(arr, visited, i);}}if (flag) {count++;}}
}
并查集
套用并查集的模板,输出并查集的个数即可。
import java.util.Scanner;public class ServiceBroadcast_union {public static void main(String[] args) {Scanner in = new Scanner(System.in);String[] str = in.nextLine().split(" ");int n = str.length;int[][] arr = new int[n][n];for(int i = 0; i < n; i++) { // 把第一行加入arrarr[0][i] = Integer.parseInt(str[i]);}for(int i = 1; i < n; i++) { // 把剩下的行加入arrString[] s = in.nextLine().split(" ");for(int j = 0; j < n; j++) {arr[i][j] = Integer.parseInt(s[j]);}}UF uf = new UF(n);for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (arr[i][j] == 1) { // 如果距离为1,就合并到一块uf.union(i, j);}}}System.out.println(uf.getCount());}
}
class UF { // 并查集模板,可直接复制使用int count; //连通分量个数int[] id;int[] sz;public UF(int n) {count = n;id = new int[n];sz = new int[n];for (int i = 0; i < n; i++) {id[i] = i;sz[i] = 1;}}public int getCount() {return count;}public int find(int p) {if (p != id[p]) {id[p] = find(id[p]);}return id[p];}public boolean union(int p, int q) {int pRoot = find(p);int qRoot = find(q);if (pRoot == qRoot) {return false;}if (sz[pRoot] > sz[qRoot]) {id[qRoot] = pRoot;sz[pRoot] += sz[qRoot];} else {id[pRoot] = qRoot;sz[qRoot] += sz[pRoot];}count--;return true;}
}
并查集类问题可参考:【Leetcode】并查集(Union-Find)算法。
华为机试:服务器广播相关推荐
- 华为机试真题分类汇总
1. 字符串 类别 题目 知识点 题目分值 / 难度 字符串 [华为机试真题 JAVA]TLV解析Ⅰ-100 字符串分隔.拼接.搜索 100/中等 字符串 [华为机试真题 JAVA]寻找相同子串-10 ...
- 【华为机试真题Java】从入门到入职-真题列表导读
写在前面 本专栏有100+道题(持续更新中),都是往期的HW机试真题,根据过往同学的经验基本都会考到原题.大家有什么不懂的都可以留言. 华为机试有三道题目,第一道和第二道属于简单或中等题,分值为100 ...
- 华为机试 经验(血泪史啊)
参加华为机试,第一道题竟然没有做完. 原题如下: 免单统计 题目描述 某商城举办了一个促销活动,如果某顾客是某一秒内第一个下单的顾客(可能是多个人),则可以 获取免单.请你编程计算有多少顾客可以获 ...
- 华为机试2022.4.13:硬件资源分配
第一题:老样子,题目臭长,分数最少. 硬件资源分配 题目描述 有M台服务器,每台服务器有以下属性:编号.CPU核数(1~100).内存.CPU架构(0~8).是否支持NP加速的标识(0,1).然后有一 ...
- [华为机试]某公司研发了一款高性能AI处理器
[华为机试]某公司研发了一款高性能AI处理器 题目描述 某公司研发了一款高性能AI处理器.每台物理设备具备8颗AI处理器,编号分别为0.1.2.3.4.5.6.7. 编号0-3的处理器处于同一个链路中 ...
- [华为机试真题][2014]62.去除重复字符并排序
题目 描述: 去除重复字符并排序 运行时间限制: 无限制 内容限制: 无限制 输入: 字符串 输出: 去除重复字符并排序的字符串 样例输入: aabcdefff 样例输出: abcdef 代码 /*- ...
- 牛客网--华为机试在线训练10:字符个数统计
牛客网–华为机试在线训练10:字符个数统计 题目描述 编写一个函数,计算字符串中含有的不同字符的个数.字符在ACSII码范围内(0~127).不在范围内的不作统计. 输入描述: 输入N个字符,字符在A ...
- 牛客网–华为机试在线训练9:提取不重复的数
牛客网–华为机试在线训练9:提取不重复的数 题目描述 输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数. 输入描述: 输入一个int型整数 输出描述: 按照从右向左的阅读顺 ...
- 牛客网–华为机试在线训练8:合并表记录
牛客网–华为机试在线训练8:合并表记录 题目描述 数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出. 输入描述: 先输入键值对的个 ...
- 牛客网–华为机试在线训练7:取近似值
牛客网–华为机试在线训练7:取近似值 题目描述 写出一个程序,接受一个正浮点数值,输出该数值的近似整数值.如果小数点后数值大于等于5,向上取整:小于5,则向下取整. 输入描述: 输入一个正浮点数值 输 ...
最新文章
- LVM 逻辑卷的扩容/缩容
- JavaBean中DAO设计模式介绍
- python编程语言好学吗-转行零基础该如何学习python?很庆幸,三年前的我选对了...
- 基于网络抓包实现kubernetes中微服务的应用级监控
- (转)Virtual PC 2007虚拟网络设置
- 企业信息管理- 近期功能改善(3)
- C#类的一些简单比较
- Java 蓝桥杯 常用核心类
- php算法和数据结构
- 咱也写个小写数字转大写金额 ,纯粹字符串操作实现
- mysql中XtraBackup备份工作机制
- css3 修改checkbox disabled颜色_HTML5 + CSS3 gt;gt;gt; 009
- 分享咖啡基础知识——从咖啡小白到咖啡发烧友需要了解的那些事儿!
- 【Sutcliffe Pentagons】奇幻派的漂流
- 电子书chm转换html,chm转换为html的超简单方法
- PLINK-GWAS学习6------数据质控之杂合率质控
- Python的特殊属性和用法
- 为什么说微博、微信、贴吧、头条们都在做同一件事?
- 【软考 系统架构设计师】计算机组成与体系结构⑥ 流水线
- Unity3D+WebGL数据交互、传参
热门文章
- ssm整合之底层搭建
- 使用 Mitmdump 与 Python 脚本进行密码嗅探
- Tableau技巧(四)排名及组内排名
- Spring概念、类注解和Bean作用域
- 特斯拉向监管机构承认FSD只是L2,激光雷达或是最大硬伤
- 软工第三次作业——结对编程之最长单词链
- 3D游戏建模行业真的是传说中的一入职就能领“高薪”吗?
- RuntimeError: 1only batches of spatial targets supported (non-empty 3D tensors) but got targets of s
- 3030 遇见 2020
- 根据先序遍历的结果创建一棵树【D.S】