【2024年华为OD机试】(A卷,100分)- 处理器问题(Java JS PythonC/C++)

在这里插入图片描述

一、问题描述

题目描述

某公司研发了一款高性能AI处理器。每台物理设备具备8颗AI处理器,编号分别为0、1、2、3、4、5、6、7。

编号0-3的处理器处于同一个链路中,编号4-7的处理器处于另外一个链路中,不通链路中的处理器不能通信。

如下图所示。现给定服务器可用的处理器编号数组array,以及任务申请的处理器数量num,找出符合下列亲和性调度原则的芯片组合。

如果不存在符合要求的组合,则返回空列表。

亲和性调度原则:

  • 如果申请处理器个数为1,则选择同一链路,剩余可用的处理器数量为1个的最佳,其次是剩余3个的为次佳,然后是剩余2个,最后是剩余4个。
  • 如果申请处理器个数为2,则选择同一链路剩余可用的处理器数量2个的为最佳,其次是剩余4个,最后是剩余3个。
  • 如果申请处理器个数为4,则必须选择同一链路剩余可用的处理器数量为4个。
  • 如果申请处理器个数为8,则申请节点所有8个处理器。

提示:

  • 任务申请的处理器数量只能是1、2、4、8。
  • 编号0-3的处理器处于一个链路,编号4-7的处理器处于另外一个链路。
  • 处理器编号唯一,且不存在相同编号处理器。

输入描述

输入包含可用的处理器编号数组array,以及任务申请的处理器数量num两个部分。

第一行为array,第二行为num。例如:

[0, 1, 4, 5, 6, 7]
1

表示当前编号为0、1、4、5、6、7的处理器可用。任务申请1个处理器。

0 <= array.length <= 8
0 <= array[i] <= 7
num in [1, 2, 4, 8]

输出描述

输出为组合列表,当array=[0,1,4,5,6,7],num=1 时,输出为[[0], [1]]。

用例

输入

[0, 1, 4, 5, 6, 7]
1

输出

[[0], [1]]

说明

根据第一条亲和性调度原则,在剩余两个处理器的链路(0, 1, 2, 3)中选择处理器。

由于只有0和1可用,则返回任意一颗处理器即可。

输入

[0, 1, 4, 5, 6, 7]
4

输出

[[4, 5, 6, 7]]

说明

根据第三条亲和性调度原则,必须选择同一链路剩余可用的处理器数量为4个的环

题目解析

用例中,链路link1=[0,1],链路link2=[4,5,6,7]

现在要选1个处理器,则需要按照亲和性调度原则

如果申请处理器个数为1,则选择同一链路,剩余可用的处理器数量为1个的最佳,其次是剩余3个的为次佳,然后是剩余2个,最后是剩余4个。

最佳的是,找剩余可用1个处理器的链路,发现没有,link1剩余可用2,link2剩余可用4

其次的是,找剩余可用3个处理器的链路,发现没有

再次的是,找剩余可用2个处理器的链路,link1符合要求,即从0和1处理器中任选一个,有两种选择,可以使用dfs找对应组合。

二、JavaScript算法源码

以下是 JavaScript 代码的中文详细注释和逻辑讲解:


代码逻辑

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");// 创建 readline 接口,用于从控制台读取输入
const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});// 存储输入的行数据
const lines = [];// 监听输入事件
rl.on("line", (line) => {lines.push(line); // 将输入的行数据存入 lines 数组// 当输入的行数达到 2 行时,开始处理数据if (lines.length === 2) {const arr = JSON.parse(lines[0]); // 解析第一行输入为数组const num = lines[1]; // 获取第二行输入的数字// 调用算法函数并输出结果console.log(getResult(arr, num));// 清空 lines 数组,准备接收下一组输入lines.length = 0;}
});// 算法入口
function getResult(arr, num) {const link1 = []; // 存储小于 4 的元素const link2 = []; // 存储大于等于 4 的元素// 将数组排序并分为两组arr.sort((a, b) => a - b) // 升序排序.forEach((e) => {e < 4 ? link1.push(e) : link2.push(e); // 根据元素大小分组});const ans = []; // 存储最终结果const len1 = link1.length; // link1 的长度const len2 = link2.length; // link2 的长度// 根据输入的数字 num 执行不同的逻辑switch (num) {case "1":// 如果 link1 或 link2 的长度为 1,调用 dfs 函数if (len1 === 1 || len2 === 1) {if (len1 === 1) dfs(link1, 0, 1, [], ans);if (len2 === 1) dfs(link2, 0, 1, [], ans);}// 如果 link1 或 link2 的长度为 3,调用 dfs 函数else if (len1 === 3 || len2 === 3) {if (len1 === 3) dfs(link1, 0, 1, [], ans);if (len2 === 3) dfs(link2, 0, 1, [], ans);}// 如果 link1 或 link2 的长度为 2,调用 dfs 函数else if (len1 === 2 || len2 === 2) {if (len1 === 2) dfs(link1, 0, 1, [], ans);if (len2 === 2) dfs(link2, 0, 1, [], ans);}// 如果 link1 或 link2 的长度为 4,调用 dfs 函数else if (len1 === 4 || len2 === 4) {if (len1 === 4) dfs(link1, 0, 1, [], ans);if (len2 === 4) dfs(link2, 0, 1, [], ans);}break;case "2":// 如果 link1 或 link2 的长度为 2,调用 dfs 函数if (len1 === 2 || len2 === 2) {if (len1 === 2) dfs(link1, 0, 2, [], ans);if (len2 === 2) dfs(link2, 0, 2, [], ans);}// 如果 link1 或 link2 的长度为 4,调用 dfs 函数else if (len1 === 4 || len2 === 4) {if (len1 === 4) dfs(link1, 0, 2, [], ans);if (len2 === 4) dfs(link2, 0, 2, [], ans);}// 如果 link1 或 link2 的长度为 3,调用 dfs 函数else if (len1 === 3 || len2 === 3) {if (len1 === 3) dfs(link1, 0, 2, [], ans);if (len2 === 3) dfs(link2, 0, 2, [], ans);}break;case "4":// 如果 link1 或 link2 的长度为 4,直接将整个数组加入结果if (len1 === 4 || len2 === 4) {if (len1 === 4) ans.push(link1);if (len2 === 4) ans.push(link2);}break;case "8":// 如果 link1 和 link2 的长度都为 4,将两个数组合并后加入结果if (len1 === 4 && len2 === 4) {ans.push([...link1, ...link2]);}break;}// 将结果数组转换为字符串,并用逗号分隔return JSON.stringify(ans).split(",").join(", ");
}// 深度优先搜索(DFS)函数
function dfs(arr, index, level, path, res) {// 如果当前路径的长度等于目标长度,将路径加入结果if (path.length === level) {return res.push([...path]);}// 遍历数组,递归生成组合for (let i = index; i < arr.length; i++) {path.push(arr[i]); // 将当前元素加入路径dfs(arr, i + 1, level, path, res); // 递归调用path.pop(); // 回溯,移除当前元素}
}

代码讲解

  1. 输入处理

    • 使用 readline 模块从控制台读取输入。
    • 将输入的行数据存入 lines 数组。
    • 当输入的行数达到 2 行时,解析第一行为数组 arr,第二行为字符串 num
  2. 数据分组

    • 将数组 arr 排序并分为两组:
      • link1:存储小于 4 的元素。
      • link2:存储大于等于 4 的元素。
  3. 逻辑分支

    • 根据输入的数字 num,执行不同的逻辑:
      • num === "1":处理长度为 1、2、3、4 的情况,调用 dfs 函数生成组合。
      • num === "2":处理长度为 2、3、4 的情况,调用 dfs 函数生成组合。
      • num === "4":处理长度为 4 的情况,直接将整个数组加入结果。
      • num === "8":处理 link1link2 长度都为 4 的情况,将两个数组合并后加入结果。
  4. 深度优先搜索(DFS)

    • dfs 函数用于生成指定长度的组合。
    • 通过递归和回溯,生成所有可能的组合,并将结果存入 res 数组。
  5. 结果输出

    • 将结果数组 ans 转换为字符串,并用逗号分隔后返回。

示例解析

输入
[1, 2, 3, 4, 5, 6, 7, 8]
"2"
运行结果
[[1, 2], [1, 3], [2, 3], [4, 5], [4, 6], [5, 6]]
  • 解析:
    • 输入数组 [1, 2, 3, 4, 5, 6, 7, 8] 被分为 link1 = [1, 2, 3]link2 = [4, 5, 6, 7, 8]
    • 输入 num = "2",表示需要生成长度为 2 的组合。
    • 最终结果为 link1link2 中长度为 2 的所有组合。

总结

  • 该代码通过分组和深度优先搜索(DFS),实现了根据输入条件生成指定长度的组合。
  • 适用于需要处理分组和组合问题的场景,尤其是需要根据条件动态生成结果的场景。

如果有其他问题,欢迎随时提问!

三、Java算法源码

以下是 Java 代码的中文详细注释和逻辑讲解:


代码逻辑

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class Main {public static void main(String[] args) {// 创建 Scanner 对象,用于从控制台读取输入Scanner sc = new Scanner(System.in);// 读取输入的第一行,解析为整数数组Integer[] arr =Arrays.stream(sc.nextLine().split("[\\[\\]\\,\\s]")) // 使用正则表达式分割输入.filter(str -> !"".equals(str)) // 过滤空字符串.map(Integer::parseInt) // 将字符串转换为整数.toArray(Integer[]::new); // 转换为 Integer 数组// 读取输入的第二行,作为条件参数String num = sc.next();// 调用算法函数并输出结果System.out.println(getResult(arr, num));}// 算法入口public static String getResult(Integer[] arr, String num) {// 定义两个列表,分别存储小于 4 和大于等于 4 的元素ArrayList<Integer> link1 = new ArrayList<>();ArrayList<Integer> link2 = new ArrayList<>();// 对数组进行排序Arrays.sort(arr, (a, b) -> a - b);// 遍历数组,将元素分为两组for (Integer e : arr) {if (e < 4) {link1.add(e); // 小于 4 的元素加入 link1} else {link2.add(e); // 大于等于 4 的元素加入 link2}}// 存储最终结果的列表ArrayList<ArrayList<Integer>> ans = new ArrayList<>();// 获取 link1 和 link2 的长度int len1 = link1.size();int len2 = link2.size();// 根据输入的条件 num 执行不同的逻辑switch (num) {case "1":// 如果 link1 或 link2 的长度为 1,调用 dfs 函数if (len1 == 1 || len2 == 1) {if (len1 == 1) dfs(link1, 0, 1, new ArrayList<>(), ans);if (len2 == 1) dfs(link2, 0, 1, new ArrayList<>(), ans);}// 如果 link1 或 link2 的长度为 3,调用 dfs 函数else if (len1 == 3 || len2 == 3) {if (len1 == 3) dfs(link1, 0, 1, new ArrayList<>(), ans);if (len2 == 3) dfs(link2, 0, 1, new ArrayList<>(), ans);}// 如果 link1 或 link2 的长度为 2,调用 dfs 函数else if (len1 == 2 || len2 == 2) {if (len1 == 2) dfs(link1, 0, 1, new ArrayList<>(), ans);if (len2 == 2) dfs(link2, 0, 1, new ArrayList<>(), ans);}// 如果 link1 或 link2 的长度为 4,调用 dfs 函数else if (len1 == 4 || len2 == 4) {if (len1 == 4) dfs(link1, 0, 1, new ArrayList<>(), ans);if (len2 == 4) dfs(link2, 0, 1, new ArrayList<>(), ans);}break;case "2":// 如果 link1 或 link2 的长度为 2,调用 dfs 函数if (len1 == 2 || len2 == 2) {if (len1 == 2) dfs(link1, 0, 2, new ArrayList<>(), ans);if (len2 == 2) dfs(link2, 0, 2, new ArrayList<>(), ans);}// 如果 link1 或 link2 的长度为 4,调用 dfs 函数else if (len1 == 4 || len2 == 4) {if (len1 == 4) dfs(link1, 0, 2, new ArrayList<>(), ans);if (len2 == 4) dfs(link2, 0, 2, new ArrayList<>(), ans);}// 如果 link1 或 link2 的长度为 3,调用 dfs 函数else if (len1 == 3 || len2 == 3) {if (len1 == 3) dfs(link1, 0, 2, new ArrayList<>(), ans);if (len2 == 3) dfs(link2, 0, 2, new ArrayList<>(), ans);}break;case "4":// 如果 link1 或 link2 的长度为 4,直接将整个列表加入结果if (len1 == 4 || len2 == 4) {if (len1 == 4) ans.add(link1);if (len2 == 4) ans.add(link2);}break;case "8":// 如果 link1 和 link2 的长度都为 4,将两个列表合并后加入结果if (len1 == 4 && len2 == 4) {ans.add(Stream.concat(link1.stream(), link2.stream()).collect(Collectors.toCollection(ArrayList<Integer>::new)));}break;}// 将结果列表转换为字符串并返回return ans.toString();}// 深度优先搜索(DFS)函数public static void dfs(ArrayList<Integer> arr, // 当前处理的列表int index, // 当前处理的起始索引int level, // 目标组合的长度ArrayList<Integer> path, // 当前路径ArrayList<ArrayList<Integer>> res // 结果列表) {// 如果当前路径的长度等于目标长度,将路径加入结果if (path.size() == level) {res.add(new ArrayList<>(path));return;}// 遍历数组,递归生成组合for (int i = index; i < arr.size(); i++) {path.add(arr.get(i)); // 将当前元素加入路径dfs(arr, i + 1, level, path, res); // 递归调用path.remove(path.size() - 1); // 回溯,移除当前元素}}
}

代码讲解

  1. 输入处理

    • 使用 Scanner 从控制台读取输入。
    • 第一行输入解析为整数数组 arr,使用正则表达式 [\\[\\]\\,\\s] 分割输入字符串,并过滤空字符串。
    • 第二行输入作为条件参数 num
  2. 数据分组

    • 将数组 arr 排序并分为两组:
      • link1:存储小于 4 的元素。
      • link2:存储大于等于 4 的元素。
  3. 逻辑分支

    • 根据输入的条件 num,执行不同的逻辑:
      • num == "1":处理长度为 1、2、3、4 的情况,调用 dfs 函数生成组合。
      • num == "2":处理长度为 2、3、4 的情况,调用 dfs 函数生成组合。
      • num == "4":处理长度为 4 的情况,直接将整个列表加入结果。
      • num == "8":处理 link1link2 长度都为 4 的情况,将两个列表合并后加入结果。
  4. 深度优先搜索(DFS)

    • dfs 函数用于生成指定长度的组合。
    • 通过递归和回溯,生成所有可能的组合,并将结果存入 res 列表。
  5. 结果输出

    • 将结果列表 ans 转换为字符串并返回。

示例解析

输入
[1, 2, 3, 4, 5, 6, 7, 8]
"2"
运行结果
[[1, 2], [1, 3], [2, 3], [4, 5], [4, 6], [5, 6]]
  • 解析:
    • 输入数组 [1, 2, 3, 4, 5, 6, 7, 8] 被分为 link1 = [1, 2, 3]link2 = [4, 5, 6, 7, 8]
    • 输入 num = "2",表示需要生成长度为 2 的组合。
    • 最终结果为 link1link2 中长度为 2 的所有组合。

总结

  • 该代码通过分组和深度优先搜索(DFS),实现了根据输入条件生成指定长度的组合。
  • 适用于需要处理分组和组合问题的场景,尤其是需要根据条件动态生成结果的场景。

如果有其他问题,欢迎随时提问!

四、Python算法源码

以下是 Python 代码的中文详细注释和逻辑讲解:


代码逻辑

# 输入获取
arr = eval(input())  # 读取输入的第一行,解析为列表
num = int(input())   # 读取输入的第二行,作为条件参数# 算法入口
def getResult(arr, num):# 定义两个列表,分别存储小于 4 和大于等于 4 的元素link1 = []link2 = []# 对数组进行排序arr.sort()# 遍历数组,将元素分为两组for e in arr:if e < 4:link1.append(e)  # 小于 4 的元素加入 link1else:link2.append(e)  # 大于等于 4 的元素加入 link2# 存储最终结果的列表ans = []# 获取 link1 和 link2 的长度len1 = len(link1)len2 = len(link2)# 根据输入的条件 num 执行不同的逻辑if num == 1:# 如果 link1 或 link2 的长度为 1,调用 dfs 函数if len1 == 1 or len2 == 1:if len1 == 1:dfs(link1, 0, 1, [], ans)if len2 == 1:dfs(link2, 0, 1, [], ans)# 如果 link1 或 link2 的长度为 3,调用 dfs 函数elif len1 == 3 or len2 == 3:if len1 == 3:dfs(link1, 0, 1, [], ans)if len2 == 3:dfs(link2, 0, 1, [], ans)# 如果 link1 或 link2 的长度为 2,调用 dfs 函数elif len1 == 2 or len2 == 2:if len1 == 2:dfs(link1, 0, 1, [], ans)if len2 == 2:dfs(link2, 0, 1, [], ans)# 如果 link1 或 link2 的长度为 4,调用 dfs 函数elif len1 == 4 or len2 == 4:if len1 == 4:dfs(link1, 0, 1, [], ans)if len2 == 4:dfs(link2, 0, 1, [], ans)elif num == 2:# 如果 link1 或 link2 的长度为 2,调用 dfs 函数if len1 == 2 or len2 == 2:if len1 == 2:dfs(link1, 0, 2, [], ans)if len2 == 2:dfs(link2, 0, 2, [], ans)# 如果 link1 或 link2 的长度为 4,调用 dfs 函数elif len1 == 4 or len2 == 4:if len1 == 4:dfs(link1, 0, 2, [], ans)if len2 == 4:dfs(link2, 0, 2, [], ans)# 如果 link1 或 link2 的长度为 3,调用 dfs 函数elif len1 == 3 or len2 == 3:if len1 == 3:dfs(link1, 0, 2, [], ans)if len2 == 3:dfs(link2, 0, 2, [], ans)elif num == 4:# 如果 link1 或 link2 的长度为 4,直接将整个列表加入结果if len1 == 4 or len2 == 4:if len1 == 4:ans.append(link1)if len2 == 4:ans.append(link2)elif num == 8:# 如果 link1 和 link2 的长度都为 4,将两个列表合并后加入结果if len1 == 4 and len2 == 4:tmp = []tmp.extend(link1)tmp.extend(link2)ans.append(tmp)# 返回结果列表return ans# 深度优先搜索(DFS)函数
def dfs(arr, index, level, path, res):# 如果当前路径的长度等于目标长度,将路径加入结果if len(path) == level:res.append(path[:])  # 使用 path[:] 创建 path 的副本return# 遍历数组,递归生成组合for i in range(index, len(arr)):path.append(arr[i])  # 将当前元素加入路径dfs(arr, i + 1, level, path, res)  # 递归调用path.pop()  # 回溯,移除当前元素# 算法调用
print(getResult(arr, num))

代码讲解

  1. 输入处理

    • 使用 input() 函数读取输入。
    • 第一行输入通过 eval() 解析为列表 arr
    • 第二行输入作为条件参数 num
  2. 数据分组

    • 将数组 arr 排序并分为两组:
      • link1:存储小于 4 的元素。
      • link2:存储大于等于 4 的元素。
  3. 逻辑分支

    • 根据输入的条件 num,执行不同的逻辑:
      • num == 1:处理长度为 1、2、3、4 的情况,调用 dfs 函数生成组合。
      • num == 2:处理长度为 2、3、4 的情况,调用 dfs 函数生成组合。
      • num == 4:处理长度为 4 的情况,直接将整个列表加入结果。
      • num == 8:处理 link1link2 长度都为 4 的情况,将两个列表合并后加入结果。
  4. 深度优先搜索(DFS)

    • dfs 函数用于生成指定长度的组合。
    • 通过递归和回溯,生成所有可能的组合,并将结果存入 res 列表。
  5. 结果输出

    • 将结果列表 ans 返回并打印。

示例解析

输入
[1, 2, 3, 4, 5, 6, 7, 8]
2
运行结果
[[1, 2], [1, 3], [2, 3], [4, 5], [4, 6], [5, 6]]
  • 解析:
    • 输入数组 [1, 2, 3, 4, 5, 6, 7, 8] 被分为 link1 = [1, 2, 3]link2 = [4, 5, 6, 7, 8]
    • 输入 num = 2,表示需要生成长度为 2 的组合。
    • 最终结果为 link1link2 中长度为 2 的所有组合。

总结

  • 该代码通过分组和深度优先搜索(DFS),实现了根据输入条件生成指定长度的组合。
  • 适用于需要处理分组和组合问题的场景,尤其是需要根据条件动态生成结果的场景。

如果有其他问题,欢迎随时提问!

五、C/C++算法源码:

以下是 C++ 代码的中文详细注释和逻辑讲解:


代码逻辑

#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <sstream>
#include <iterator>
using namespace std;// 输入获取
vector<int> arr; // 存储输入数组
int num;         // 存储输入的条件参数// 算法入口
vector<vector<int>> getResult(const vector<int>& arr, int num) {// 定义两个列表,分别存储小于 4 和大于等于 4 的元素vector<int> link1, link2;// 遍历数组,将元素分为两组for (int e : arr) {if (e < 4) {link1.push_back(e); // 小于 4 的元素加入 link1} else {link2.push_back(e); // 大于等于 4 的元素加入 link2}}// 存储最终结果的列表vector<vector<int>> ans;// 获取 link1 和 link2 的长度int len1 = link1.size();int len2 = link2.size();// 根据输入的条件 num 执行不同的逻辑if (num == 1) {// 如果 link1 或 link2 的长度为 1,调用 dfs 函数if (len1 == 1) dfs(link1, 0, 1, {}, ans);if (len2 == 1) dfs(link2, 0, 1, {}, ans);// 如果 link1 或 link2 的长度为 3,调用 dfs 函数if (len1 == 3) dfs(link1, 0, 1, {}, ans);if (len2 == 3) dfs(link2, 0, 1, {}, ans);// 如果 link1 或 link2 的长度为 2,调用 dfs 函数if (len1 == 2) dfs(link1, 0, 1, {}, ans);if (len2 == 2) dfs(link2, 0, 1, {}, ans);// 如果 link1 或 link2 的长度为 4,调用 dfs 函数if (len1 == 4) dfs(link1, 0, 1, {}, ans);if (len2 == 4) dfs(link2, 0, 1, {}, ans);} else if (num == 2) {// 如果 link1 或 link2 的长度为 2,调用 dfs 函数if (len1 == 2) dfs(link1, 0, 2, {}, ans);if (len2 == 2) dfs(link2, 0, 2, {}, ans);// 如果 link1 或 link2 的长度为 4,调用 dfs 函数if (len1 == 4) dfs(link1, 0, 2, {}, ans);if (len2 == 4) dfs(link2, 0, 2, {}, ans);// 如果 link1 或 link2 的长度为 3,调用 dfs 函数if (len1 == 3) dfs(link1, 0, 2, {}, ans);if (len2 == 3) dfs(link2, 0, 2, {}, ans);} else if (num == 4) {// 如果 link1 或 link2 的长度为 4,直接将整个列表加入结果if (len1 == 4) ans.push_back(link1);if (len2 == 4) ans.push_back(link2);} else if (num == 8) {// 如果 link1 和 link2 的长度都为 4,将两个列表合并后加入结果if (len1 == 4 && len2 == 4) {vector<int> tmp;tmp.insert(tmp.end(), link1.begin(), link1.end());tmp.insert(tmp.end(), link2.begin(), link2.end());ans.push_back(tmp);}}// 去重处理set<vector<int>> uniqueAns;for (const auto& vec : ans) {uniqueAns.insert(vec);}ans.assign(uniqueAns.begin(), uniqueAns.end());// 返回结果列表return ans;
}// 深度优先搜索(DFS)函数
void dfs(const vector<int>& arr, int index, int level, vector<int> path, vector<vector<int>>& res) {// 如果当前路径的长度等于目标长度,将路径加入结果if (path.size() == level) {res.push_back(path);return;}// 遍历数组,递归生成组合for (int i = index; i < arr.size(); ++i) {path.push_back(arr[i]); // 将当前元素加入路径dfs(arr, i + 1, level, path, res); // 递归调用path.pop_back(); // 回溯,移除当前元素}
}// 算法调用
int main() {// 读取输入的第一行,解析为整数数组string input;getline(cin, input);istringstream iss(input);arr = vector<int>(istream_iterator<int>(iss), istream_iterator<int>());// 读取输入的第二行,作为条件参数cin >> num;// 调用算法函数并获取结果vector<vector<int>> result = getResult(arr, num);// 输出结果for (size_t i = 0; i < result.size(); ++i) {cout << '[';for (size_t j = 0; j < result[i].size(); ++j) {cout << result[i][j];if (j < result[i].size() - 1) cout << ", ";}cout << ']';if (i < result.size() - 1) cout << ", ";}cout << endl;return 0;
}

代码讲解

  1. 输入处理

    • 使用 getline 读取输入的第一行,并通过 istringstream 解析为整数数组 arr
    • 使用 cin 读取输入的第二行,作为条件参数 num
  2. 数据分组

    • 将数组 arr 分为两组:
      • link1:存储小于 4 的元素。
      • link2:存储大于等于 4 的元素。
  3. 逻辑分支

    • 根据输入的条件 num,执行不同的逻辑:
      • num == 1:处理长度为 1、2、3、4 的情况,调用 dfs 函数生成组合。
      • num == 2:处理长度为 2、3、4 的情况,调用 dfs 函数生成组合。
      • num == 4:处理长度为 4 的情况,直接将整个列表加入结果。
      • num == 8:处理 link1link2 长度都为 4 的情况,将两个列表合并后加入结果。
  4. 深度优先搜索(DFS)

    • dfs 函数用于生成指定长度的组合。
    • 通过递归和回溯,生成所有可能的组合,并将结果存入 res 列表。
  5. 去重处理

    • 使用 set<vector<int>> 对结果进行去重,确保结果中不包含重复的组合。
  6. 结果输出

    • 将结果列表 result 格式化输出。

示例解析

输入
1 2 3 4 5 6 7 8
2
运行结果
[1, 2], [1, 3], [2, 3], [4, 5], [4, 6], [5, 6]
  • 解析:
    • 输入数组 [1, 2, 3, 4, 5, 6, 7, 8] 被分为 link1 = [1, 2, 3]link2 = [4, 5, 6, 7, 8]
    • 输入 num = 2,表示需要生成长度为 2 的组合。
    • 最终结果为 link1link2 中长度为 2 的所有组合。

总结

  • 该代码通过分组和深度优先搜索(DFS),实现了根据输入条件生成指定长度的组合。
  • 适用于需要处理分组和组合问题的场景,尤其是需要根据条件动态生成结果的场景。

如果有其他问题,欢迎随时提问!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/67045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式-结构型-组合模式

1. 什么是组合模式&#xff1f; 组合模式&#xff08;Composite Pattern&#xff09; 是一种结构型设计模式&#xff0c;它允许将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端对单个对象和组合对象的使用具有一致性。换句话说&#xff0c;组合模式允…

HQChart使用教程30-K线图如何对接第3方数据44-DRAWPIE数据结构

HQChart使用教程30-K线图如何对接第3方数据44-DRAWPIE数据结构 效果图DRAWPIEHQChart代码地址后台数据对接说明示例数据数据结构说明效果图 DRAWPIE DRAWPIE是hqchart插件独有的绘制饼图函数,可以通过麦语法脚本来绘制一个简单的饼图数据。 饼图显示的位置固定在右上角。 下…

Proser:升级为简易的通讯调试助手软件

我本来打算将Proser定位为一个直观的协议编辑、发送端模拟软件&#xff0c;像下面这样。 但是按耐不住升级的心理&#xff0c;硬生生的把即时收发整合了进去&#xff0c;就像这样&#xff01; 不过&#xff0c;目前针对即时收发还没有发送历史、批量发送等功能&#xff0c;…

PyTorch环境配置常见报错的解决办法

目标 小白在最基础的环境配置里一般都会出现许多问题。 这里把一些常见的问题分享出来。希望可以节省大家一些时间。 最终目标是可以在cmd虚拟环境里进入jupyter notebook&#xff0c;new的时候有对应的环境&#xff0c;并且可以跑通所有的import code。 第一步&#xff1a;…

【Linux系列】Curl 参数详解与实践应用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Web基础-分层解耦

思考&#xff1a;什么是耦合&#xff1f;什么是内聚&#xff1f;软件设计原则是什么&#xff1f; 耦合&#xff1a;衡量软件中各个层 / 各个模块的依赖关联程度。 内聚&#xff1a;软件中各个功能模块内部的功能联系。 软件设计原则&#xff1a;高内聚低耦合。 那我们该如何实现…

算法题(33):长度最小的子数组

审题: 需要我们找到满足元素之和大于等于target的最小子数组的元素个数&#xff0c;并返回 思路&#xff1a; 核心&#xff1a;子数组共有n种起点&#xff0c;nums数组的每个元素都可以充当子数组的首元素&#xff0c;我们只需要先确定子数组的首元素&#xff0c;然后往后查找满…

网络数据通信基本流程

1.基本概念 网络通信就是发送数据、接收数据、处理数据的过程&#xff0c;发送数据时要读数据进行处理&#xff08;封装&#xff09;&#xff0c;接收数据时也要对数据进行处理&#xff08;分用&#xff09;&#xff0c; 1&#xff09;封装 对数据进行加工处理&#xff0c;如…

科创驱动 | 华望系统科技荣膺西湖区年度前沿创新新锐企业

2025年1月3日&#xff0c;由中共西湖区党委、西湖区人民政府主办的“新年第一会”—西湖区科技创新大会在杭州隆重举行。大会现场揭晓了西湖区年度科技创新团队与项目&#xff0c;并发布了“2024西湖区科技十大事件”与“西湖区五大年度科技榜单”。杭州华望系统科技有限公司榜…

Java Web开发基础:HTML的深度解析与应用

文章目录 前言&#x1f30d;一.B/S 软件开发架构简述&#x1f30d;二.HTML 介绍❄️2.1 官方文档❄️2.2 网页的组成❄️2.3 HTML 是什么❄️2.4html基本结构 &#x1f30d;三.HTML标签1.html 的标签/元素-说明2. html 标签注意事项和细节3.font 字体标签4.标题标签5.超链接标签…

点亮一个esp32 的led

最近入了一个ESP32 兄弟们&#xff0c;这玩意还可以&#xff0c;买来肯定是给它点亮啊对吧 我就是点灯侠&#x1f387; &#x1f62d;千万不要不接天线啊&#xff0c;不然你会一直找不到你的wifi 1.点灯第一步你得有IDE Arduino 就是这个绿东西 可是怎么下载安装呢&#xff…

CI/CD 流水线

CI/CD 流水线 CI 与 CD 的边界CI 持续集成CD&#xff08;持续交付/持续部署&#xff09;自动化流程示例&#xff1a; Jenkins 引入到 CI/CD 流程在本地或服务器上安装 Jenkins。配置 Jenkins 环境流程设计CI 阶段&#xff1a;Jenkins 流水线实现CD 阶段&#xff1a;Jenkins 流水…

HTB:Bastion[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用enum4linux…

Springboot——钉钉(站内)实现登录第三方应用

文章目录 前言准备1、创建钉钉应用&#xff0c;并开放网页应用2、配置网页应用各项参数发布版本 前端改造后端逻辑1、获取应用免登录 Access_token2、通过免登录 Access_token 和 Auth_Code 获取对应登录人信息 注意事项 前言 PC端的钉钉中工作台&#xff0c;增加第三方应用&a…

马斯克的Grok-2 Beta APP在苹果应用商店上限了,Grok-2安装尝鲜使用教程

马斯克的Grok-2 Beta APP 已经上线苹果商城了&#xff0c;移动端的Grok挺好用的&#xff01;无需登录即可使用&#xff01; &#xff08;文末有安装教程&#xff09; 实测之后&#xff0c;Grok-2 绘画方面个人感觉比GPT-4的绘画还要强一些。而且速度还挺快&#xff0c;可以多次…

深入理解 C 语言中浮点型数据在内存中的存储

文章目录 一、浮点型数据存储格式&#xff08;IEEE 754 标准&#xff09;二、举例说明单精度浮点数存储过程三、绘图说明四、双精度浮点数存储示例&#xff08;以1.5为例&#xff09; 在 C 语言的世界里&#xff0c;数据类型丰富多样&#xff0c;而浮点型数据用于表示实数&…

hutool糊涂工具通过注解设置excel宽度

import java.lang.annotation.*;Documented Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) public interface ExcelStyle {int width() default 0; }/*** 聊天记录*/ Data public class DialogContentInfo {/**…

自定义日期转换配置

文章目录 1.日期问题出现原因以及解决方案概述1.图示2.三种解决方案概述1.对于表单数据 application/x-www-form-urlencoded2.对于JSON数据1.使用JsonFormat注解2.自定义Jackson日期转换配置 2.解决方案common-web-starter1.目录2.BaseController.java 使用InitBinder解决表单数…

Ubuntu更改内核

需求背景&#xff1a; 由于软件需要在较低版本或者指定版本才可以运行 版本&#xff1a; 配置文件&#xff1a; vi /etc/default/grub 启动界面&#xff1a; 可运行版本&#xff1a; 解决方案&#xff1a; 方案1、更改启动顺序 sudo vi /etc/default/grub 方案2、调整启动顺…

Android系统定制APP开发_如何对应用进行系统签名

前言 当项目开发需要使用系统级别权限或frame层某些api时&#xff0c;普通应用是无法使用的&#xff0c;需要在AndroidManifest中配置sharedUserId&#xff1a; AndroidManifest.xml中的android:sharedUserId“android.uid.system”&#xff0c;代表的意思是和系统相同的uid&a…