华为OD-D卷精准核酸检测

为了达到新冠疫情精准防控的需要,为了避免全员核酸检测带来的浪费,需要精准圈定可能被感染的人群。

现在根据传染病流调以及大数据分析,得到了每个人之间在时间、空间上是否存在轨迹的交叉。

现在给定一组确诊人员编号(X1, X2, X3, .... Xn),在所有人当中,找出哪些人需要进行核酸检测,输出需要进行核酸检测的人数。(注意:确诊病例自身不需要再做核酸检测)

需要进行核酸检测的人,是病毒传播链条上的所有人员,即有可能通过确诊病例所能传播到的所有人。

例如:A是确诊病例,A和B有接触、B和C有接触、C和D有接触、D和E有接触,那么B\C\D\E都是需要进行核酸检测的人。

输入描述:

第一行为总人数N

第二行为确诊病例人员编号(确诊病例人员数量<N),用逗号分割

第三行开始,为一个N*N的矩阵,表示每个人员之间是否有接触,0表示没有接触,1表示有接触。

输出描述:

整数:需要做核酸检测的人数

备注:

人员编号从0开始

0<N<100

题目解析:其实就是循环的去遍历确诊病例找到接触的人员,然后把接触人员也遍历下继续找就行,唯一需要注意的是,遍历的过程可能遇到重复的接触人员,最好通过set进行去重就好了,最后返回set的大小,记得返回的目标值要减去确诊人员数量。

java 复制代码
import java.util.*;

public class Main {
    public static void main(String[] args) {
//        int n = 5;
//        int[] target = new int[]{1, 2};
//        int[][] nums = new int[][]{{1, 1, 0, 1, 0}, {1, 1, 0, 0, 0}, {0, 0, 1, 0, 1}, {1, 0, 0, 1, 0}, {0, 0, 1, 0, 1}};
        // 处理数据
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();

        String[] string1 = scanner.next().split(",");
        int[] target = new int[string1.length];
        for (int i = 0; i < target.length; i++) {
            target[i] = Integer.parseInt(string1[i]);
        }
        int[][] nums = new int[n][n];
        for (int i = 0; i < n; i++) {
            String[] string = scanner.next().split(",");
            for (int j = 0; j < n; j++) {
                nums[i][j] = Integer.parseInt(string[j]);
            }
        }
        // stack用于存储确诊人员和接触人员,依次从里面找
        Stack<Integer> stack = new Stack();
        // set进行去重,避免死循环
        HashSet<Integer> set = new HashSet<>();
        for (int i = 0; i < target.length; i++) {
            set.add(target[i]);
            stack.push(target[i]);
        }
        while (!stack.isEmpty()) {
            Integer pop = stack.pop();
            // 两个for循环判断是否存在秘接人员,注意set去重
            for (int i = 0; i < n; i++) {
                if (nums[i][pop] != 1 || set.contains(i)) {
                    continue;
                }
                stack.add(i);
                set.add(i);
            }
            for (int i = 0; i < n; i++) {
                if (nums[pop][i] != 1 || set.contains(i)) {
                    continue;
                }
                stack.add(i);
                set.add(i);
            }
        }
        System.out.println(set.size() - target.length);
    }
}
相关推荐
a1879272183110 分钟前
【算法】树(二):队列与祖先——BFS 骨架三配件、短路透传与合流
算法·leetcode·二叉树··bfs·算法讲解·树遍历
syagain_zsx35 分钟前
算法基础篇 · 03 枚举(C++ 题解)
c++·算法·二进制·枚举
weixin_307779131 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab
我是章汕呐2 小时前
地级市能源消耗量及消耗强度数据【2006-2023年】平衡面板
人工智能·经验分享·算法·回归
charliejohn2 小时前
计算机考研 408 数据结构 堆的插入与删除 堆排序
算法
老鱼说AI3 小时前
从点积到希尔伯特空间:向量内积的几何本质与大模型相似度度量
人工智能·深度学习·线性代数·算法·机器学习·数学建模
地平线开发者3 小时前
模型部署|如何解决算子约束
深度学习·算法·自动驾驶
Navigator_Z4 小时前
LeetCode //C - 1254. Number of Closed Islands
c语言·算法·leetcode
deepseek234 小时前
GPT-6 Astra 破解 FrontierMath 九年悬案拆解:调和熵投票规则反证核恒非空,局部搜索如何终结反例悬赏
人工智能·算法·ai agent
syagain_zsx4 小时前
算法基础篇 · 04 前缀和(C++ 题解)
c++·算法·前缀和