【2024年华为OD机试】 (A卷,100分)- 总最快检测效率(Java JS PythonC/C++)

在这里插入图片描述

一、问题描述

题目描述

在系统、网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查。

每名采样员的效率不同,采样效率为 N 人/小时。由于外界变化,采样员的效率会以 M 人/小时为粒度发生变化,M 为采样效率浮动粒度,M = N * 10%,输入保证 N * 10% 的结果为整数。

采样员效率浮动规则:

  • 采样员需要一名志愿者协助组织才能发挥正常效率,在此基础上,每增加一名志愿者,效率提升 1M,最多提升 3M
  • 如果没有志愿者协助组织,效率下降 2M

怎么安排速度最快?求总最快检测效率(总检查效率为各采样人员效率值相加)。

输入描述

第一行:第一个值,采样员人数,取值范围 [1, 100];第二个值,志愿者人数,取值范围 [1, 500]
第二行:各采样员基准效率值(单位人/小时),取值范围 [60, 600],保证序列中每项值计算 10% 为整数。

输出描述

第一行:总最快检测效率(单位人/小时)

用例

用例 1

输入:

2 2
200 200

输出:

400

说明:
输入需要保证采样员基准效率值序列的每个值 *10% 为整数。

解题思路

  1. 计算每个采样员的效率浮动粒度 M

    • M = N * 10%
  2. 确定每个采样员的最优效率

    • 每个采样员至少需要一名志愿者才能发挥正常效率 N
    • 每增加一名志愿者,效率提升 1M,最多提升 3M
    • 如果没有志愿者协助,效率下降 2M
  3. 分配志愿者

    • 优先为每个采样员分配一名志愿者,确保每个采样员至少发挥正常效率 N
    • 剩余的志愿者按照每个采样员效率提升的优先级进行分配,即先为效率提升空间大的采样员分配志愿者。
  4. 计算总最快检测效率

    • 将所有采样员的最优效率相加。

逻辑分析解法

问题背景

假设有 x 个采样员,每个采样员的正常采样效率分别为 a1, a2, a3, ..., ax,还有 y 个志愿者。我们需要计算在最优分配志愿者的情况下,所有采样员的总最快检测效率。

初始状态

初始时,不给任何采样员分配志愿者,每个采样员的效率会下降 2M,其中 M = N * 10%。因此,所有采样员的初始效率为:
[ (a1 * 0.8) + (a2 * 0.8) + (a3 * 0.8) + … + (ax * 0.8) ]

收集每个采样员的新增效率数据

对于每个采样员,我们收集以下数据:

  • 增加第一个志愿者,新增的效率
  • 增加第二个志愿者,新增的效率
  • 增加第三个志愿者,新增的效率
  • 增加第四个志愿者,新增的效率

例如,对于采样员 a1

  • 增加第一个志愿者,新增效率 a1 * 0.2
  • 增加第二个志愿者,新增效率 a1 * 0.1
  • 增加第三个志愿者,新增效率 a1 * 0.1
  • 增加第四个志愿者,新增效率 a1 * 0.1
构建新增效率列表

我们将每个采样员的新增效率数据收集到一个列表 add 中。这个列表包含所有采样员在增加志愿者时的新增效率。

降序排序

add 列表进行降序排序,这样可以确保我们优先选择新增效率最高的组合。排序后的列表前 y 个元素即为最优的新增效率组合。

递进关系的保证

有人可能会疑问,对于每个采样员而言,其新增的效率是递进的,例如增加第二个志愿者的新增效率必须在增加第一个志愿者的基础上。排序后,是否还能保证这个递进关系?

答案是可以的。因为本题已经固定了新增效率的规则:

  • 采样员需要一名志愿者协助组织才能发挥正常效率(即提升 2M 效率)
  • 在此基础上,每增加一名志愿者,效率提升 1M

因此,一个采样员想要提升 1M 效率,前面必须先提升 2M 效率。在 add 列表进行降序排序时,2M 一定会在 1M 之前。

多个采样员的新增效率混在一起排序

即使将多个采样员的新增效率混在一起排序,也不会破坏单个采样员的新增效率的递进关系。相当于有多个降序列表,例如:

  • [8, 4, 4, 4]
  • [10, 5, 5, 5]
  • [6, 3, 3, 3]

将这些降序列表合并后,再次降序排序:
[ [10, 8, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3] ]

这个合并后的列表依然维持着各自采样员的新增效率递进关系:
[ [10, 8, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3] ]

总结

通过上述步骤,我们可以高效地计算出总最快检测效率。具体步骤如下:

  1. 计算每个采样员的初始效率(没有志愿者时的效率)。
  2. 收集每个采样员在增加志愿者时的新增效率数据。
  3. 将所有新增效率数据收集到一个列表中。
  4. 对该列表进行降序排序。
  5. 选择前 y 个新增效率数据,计算总新增效率。
  6. 将总新增效率加到初始效率上,得到总最快检测效率。

这种方法的时间复杂度主要由排序操作决定,为 O(x * 4 * log(x * 4)),其中 x 是采样员的数量。由于每个采样员最多有 4 个新增效率数据,因此 x * 4 是新增效率数据的总数。

二、JavaScript算法源码

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


JavaScript 代码实现

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;void (async function () {// 读取输入:x 是采样员人数,y 是志愿者人数const [x, y] = (await readline()).split(" ").map(Number);// 读取输入:x 个采样员的正常效率const normals = (await readline()).split(" ").map(Number);// base 记录所有采样员的裸奔效率(即没有志愿者协助时的总效率)let base = 0;// add 记录每个采样员在志愿者协助下的新增效率const add = [];// 遍历每个采样员的正常效率for (let normal of normals) {// 计算采样效率浮动粒度 M = 正常效率的 10%const m = normal * 0.1;// 如果没有志愿者协助,采样员的效率下降 2M,即 8Mbase += 8 * m;// 增加第1个志愿者时,新增效率为 2M// 增加第2个志愿者时,新增效率为 M// 增加第3个志愿者时,新增效率为 M// 增加第4个志愿者时,新增效率为 Madd.push(2 * m, m, m, m);}// 对所有新增效率进行降序排序add.sort((a, b) => b - a);// 计算最高效率:裸奔效率 + 前 y 大的新增效率const ans = base + add.slice(0, y).reduce((a, b) => a + b, 0);// 输出结果console.log(ans);
})();

代码讲解

1. 输入处理
  • 使用 readline 模块从标准输入读取数据。
  • 读取第一行输入,获取采样员人数 x 和志愿者人数 y
  • 读取第二行输入,获取每个采样员的正常效率,并存储在数组 normals 中。
2. 计算裸奔效率 base
  • 遍历每个采样员的正常效率 normal
    • 计算采样效率浮动粒度 m = normal * 0.1
    • 如果没有志愿者协助,采样员的效率下降 2m,即效率为 8m
    • 8m 累加到 base 中,表示所有采样员的裸奔效率。
3. 计算新增效率 add
  • 对于每个采样员,计算在志愿者协助下的新增效率:
    • 增加第1个志愿者时,新增效率为 2m
    • 增加第2个志愿者时,新增效率为 m
    • 增加第3个志愿者时,新增效率为 m
    • 增加第4个志愿者时,新增效率为 m
  • 将所有新增效率存储在数组 add 中。
4. 排序新增效率
  • 对数组 add 进行降序排序,确保优先选择新增效率最大的志愿者分配方案。
5. 计算最高效率
  • 取前 y 个最大的新增效率,累加到 base 中,得到最高效率 ans
  • 使用 reduce 函数对前 y 个新增效率求和。
6. 输出结果
  • 打印最高效率 ans

示例解析

输入
3 2
100 200 300
运行结果
376
  • 解析
    • 采样员正常效率:[100, 200, 300]
    • 计算每个采样员的 m 值:
      • 第1个采样员:m = 100 * 0.1 = 10
      • 第2个采样员:m = 200 * 0.1 = 20
      • 第3个采样员:m = 300 * 0.1 = 30
    • 计算裸奔效率 base
      • 第1个采样员:8 * 10 = 80
      • 第2个采样员:8 * 20 = 160
      • 第3个采样员:8 * 30 = 240
      • base = 80 + 160 + 240 = 480
    • 计算新增效率 add
      • 第1个采样员:[20, 10, 10, 10]
      • 第2个采样员:[40, 20, 20, 20]
      • 第3个采样员:[60, 30, 30, 30]
      • add = [20, 10, 10, 10, 40, 20, 20, 20, 60, 30, 30, 30]
    • add 降序排序:
      • add = [60, 40, 30, 30, 30, 20, 20, 20, 10, 10, 10, 10]
    • 取前 y = 2 个最大的新增效率:
      • 60 + 40 = 100
    • 计算最高效率:
      • ans = base + 100 = 480 + 100 = 580

总结

  • 该代码通过计算裸奔效率和新增效率,结合排序和累加操作,高效地计算了最高效率。
  • 时间复杂度主要取决于排序操作,为 O(n log n),其中 n 是新增效率的数量。
  • 代码逻辑清晰,注释详细,易于理解和扩展。

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

三、Java算法源码

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


Java 代码实现

import java.util.ArrayList;
import java.util.Scanner;public class Main {public static void main(String[] args) {// 使用 Scanner 读取输入Scanner sc = new Scanner(System.in);// 读取输入:x 是采样员人数,y 是志愿者人数int x = sc.nextInt();int y = sc.nextInt();// 读取输入:x 个采样员的正常效率int[] normals = new int[x];for (int i = 0; i < x; i++) {normals[i] = sc.nextInt();}// base 记录所有采样员的裸奔效率(即没有志愿者协助时的总效率)int base = 0;// increase 记录每个采样员在志愿者协助下的新增效率ArrayList<Integer> increase = new ArrayList<>();// 遍历每个采样员的正常效率for (int normal : normals) {// 计算采样效率浮动粒度 M = 正常效率的 10%int m = normal / 10;// 如果没有志愿者协助,采样员的效率下降 2M,即 8Mbase += 8 * m;// 增加第1个志愿者时,新增效率为 2Mincrease.add(2 * m);// 增加第2个志愿者时,新增效率为 Mincrease.add(m);// 增加第3个志愿者时,新增效率为 Mincrease.add(m);// 增加第4个志愿者时,新增效率为 Mincrease.add(m);}// 对所有新增效率进行降序排序increase.sort((a, b) -> b - a);// 计算最高效率:裸奔效率 + 前 y 大的新增效率int ans =base+ increase.subList(0, Math.min(y, increase.size())) // 取前 y 个新增效率.stream() // 转换为流.reduce(Integer::sum) // 求和.orElse(0); // 如果流为空,返回 0// 输出结果System.out.println(ans);}
}

代码讲解

1. 输入处理
  • 使用 Scanner 从标准输入读取数据。
  • 读取第一行输入,获取采样员人数 x 和志愿者人数 y
  • 读取第二行输入,获取每个采样员的正常效率,并存储在数组 normals 中。
2. 计算裸奔效率 base
  • 遍历每个采样员的正常效率 normal
    • 计算采样效率浮动粒度 m = normal / 10
    • 如果没有志愿者协助,采样员的效率下降 2m,即效率为 8m
    • 8m 累加到 base 中,表示所有采样员的裸奔效率。
3. 计算新增效率 increase
  • 对于每个采样员,计算在志愿者协助下的新增效率:
    • 增加第1个志愿者时,新增效率为 2m
    • 增加第2个志愿者时,新增效率为 m
    • 增加第3个志愿者时,新增效率为 m
    • 增加第4个志愿者时,新增效率为 m
  • 将所有新增效率存储在 ArrayList<Integer> increase 中。
4. 排序新增效率
  • increase 进行降序排序,确保优先选择新增效率最大的志愿者分配方案。
5. 计算最高效率
  • 取前 y 个最大的新增效率:
    • 使用 subList(0, Math.min(y, increase.size())) 确保不会越界。
  • 使用 stream().reduce(Integer::sum) 对前 y 个新增效率求和。
  • 如果流为空(即 y = 0),返回 0
6. 输出结果
  • 打印最高效率 ans

示例解析

输入
3 2
100 200 300
运行结果
580
  • 解析
    • 采样员正常效率:[100, 200, 300]
    • 计算每个采样员的 m 值:
      • 第1个采样员:m = 100 / 10 = 10
      • 第2个采样员:m = 200 / 10 = 20
      • 第3个采样员:m = 300 / 10 = 30
    • 计算裸奔效率 base
      • 第1个采样员:8 * 10 = 80
      • 第2个采样员:8 * 20 = 160
      • 第3个采样员:8 * 30 = 240
      • base = 80 + 160 + 240 = 480
    • 计算新增效率 increase
      • 第1个采样员:[20, 10, 10, 10]
      • 第2个采样员:[40, 20, 20, 20]
      • 第3个采样员:[60, 30, 30, 30]
      • increase = [20, 10, 10, 10, 40, 20, 20, 20, 60, 30, 30, 30]
    • increase 降序排序:
      • increase = [60, 40, 30, 30, 30, 20, 20, 20, 10, 10, 10, 10]
    • 取前 y = 2 个最大的新增效率:
      • 60 + 40 = 100
    • 计算最高效率:
      • ans = base + 100 = 480 + 100 = 580

总结

  • 该代码通过计算裸奔效率和新增效率,结合排序和累加操作,高效地计算了最高效率。
  • 时间复杂度主要取决于排序操作,为 O(n log n),其中 n 是新增效率的数量。
  • 代码逻辑清晰,注释详细,易于理解和扩展。

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

四、Python算法源码

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


Python 代码实现

# 输入获取
x, y = map(int, input().split())  # x是采样员人数,y是志愿者人数
normals = list(map(int, input().split()))  # x个采样员的正常效率# 算法入口
def getResult():# base 记录所有采样员的裸奔效率(即没有志愿者协助时的总效率)base = 0# increase 记录每个采样员在志愿者协助下的新增效率increase = []# 遍历每个采样员的正常效率for normal in normals:# 计算采样效率浮动粒度 M = 正常效率的 10%m = normal // 10# 如果没有志愿者协助,采样员的效率下降 2M,即 8Mbase += 8 * m# 增加第1个志愿者时,新增效率为 2Mincrease.append(2 * m)# 增加第2个志愿者时,新增效率为 Mincrease.append(m)# 增加第3个志愿者时,新增效率为 Mincrease.append(m)# 增加第4个志愿者时,新增效率为 Mincrease.append(m)# 对所有新增效率进行降序排序increase.sort(reverse=True)# 计算最高效率:裸奔效率 + 前 y 大的新增效率return base + sum(increase[:y])# 算法调用
print(getResult())

代码讲解

1. 输入处理
  • 使用 input().split() 从标准输入读取数据。
  • 读取第一行输入,获取采样员人数 x 和志愿者人数 y
  • 读取第二行输入,获取每个采样员的正常效率,并存储在列表 normals 中。
2. 计算裸奔效率 base
  • 遍历每个采样员的正常效率 normal
    • 计算采样效率浮动粒度 m = normal // 10
    • 如果没有志愿者协助,采样员的效率下降 2m,即效率为 8m
    • 8m 累加到 base 中,表示所有采样员的裸奔效率。
3. 计算新增效率 increase
  • 对于每个采样员,计算在志愿者协助下的新增效率:
    • 增加第1个志愿者时,新增效率为 2m
    • 增加第2个志愿者时,新增效率为 m
    • 增加第3个志愿者时,新增效率为 m
    • 增加第4个志愿者时,新增效率为 m
  • 将所有新增效率存储在列表 increase 中。
4. 排序新增效率
  • increase 进行降序排序,确保优先选择新增效率最大的志愿者分配方案。
5. 计算最高效率
  • 取前 y 个最大的新增效率:
    • 使用切片 increase[:y] 获取前 y 个元素。
  • 使用 sum() 函数对前 y 个新增效率求和。
  • 将裸奔效率 base 与新增效率之和相加,得到最高效率。
6. 输出结果
  • 调用 getResult() 函数并打印结果。

示例解析

输入
3 2
100 200 300
运行结果
580
  • 解析
    • 采样员正常效率:[100, 200, 300]
    • 计算每个采样员的 m 值:
      • 第1个采样员:m = 100 // 10 = 10
      • 第2个采样员:m = 200 // 10 = 20
      • 第3个采样员:m = 300 // 10 = 30
    • 计算裸奔效率 base
      • 第1个采样员:8 * 10 = 80
      • 第2个采样员:8 * 20 = 160
      • 第3个采样员:8 * 30 = 240
      • base = 80 + 160 + 240 = 480
    • 计算新增效率 increase
      • 第1个采样员:[20, 10, 10, 10]
      • 第2个采样员:[40, 20, 20, 20]
      • 第3个采样员:[60, 30, 30, 30]
      • increase = [20, 10, 10, 10, 40, 20, 20, 20, 60, 30, 30, 30]
    • increase 降序排序:
      • increase = [60, 40, 30, 30, 30, 20, 20, 20, 10, 10, 10, 10]
    • 取前 y = 2 个最大的新增效率:
      • 60 + 40 = 100
    • 计算最高效率:
      • ans = base + 100 = 480 + 100 = 580

总结

  • 该代码通过计算裸奔效率和新增效率,结合排序和累加操作,高效地计算了最高效率。
  • 时间复杂度主要取决于排序操作,为 O(n log n),其中 n 是新增效率的数量。
  • 代码逻辑清晰,注释详细,易于理解和扩展。

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

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

以下是 C++ 实现,并附带详细的中文注释和逻辑讲解:


C++ 代码实现

#include <iostream>
#include <vector>
#include <algorithm> // 用于排序
using namespace std;// 算法入口
int getResult(int x, int y, vector<int>& normals) {// base 记录所有采样员的裸奔效率(即没有志愿者协助时的总效率)int base = 0;// increase 记录每个采样员在志愿者协助下的新增效率vector<int> increase;// 遍历每个采样员的正常效率for (int normal : normals) {// 计算采样效率浮动粒度 M = 正常效率的 10%int m = normal / 10;// 如果没有志愿者协助,采样员的效率下降 2M,即 8Mbase += 8 * m;// 增加第1个志愿者时,新增效率为 2Mincrease.push_back(2 * m);// 增加第2个志愿者时,新增效率为 Mincrease.push_back(m);// 增加第3个志愿者时,新增效率为 Mincrease.push_back(m);// 增加第4个志愿者时,新增效率为 Mincrease.push_back(m);}// 对所有新增效率进行降序排序sort(increase.begin(), increase.end(), greater<int>());// 计算最高效率:裸奔效率 + 前 y 大的新增效率int sumIncrease = 0;for (int i = 0; i < y && i < increase.size(); i++) {sumIncrease += increase[i];}return base + sumIncrease;
}int main() {// 输入获取int x, y;cin >> x >> y; // x是采样员人数,y是志愿者人数vector<int> normals(x);for (int i = 0; i < x; i++) {cin >> normals[i]; // 读取x个采样员的正常效率}// 算法调用int result = getResult(x, y, normals);// 输出结果cout << result << endl;return 0;
}

代码讲解

1. 输入处理
  • 使用 cin 从标准输入读取数据。
  • 读取第一行输入,获取采样员人数 x 和志愿者人数 y
  • 读取第二行输入,获取每个采样员的正常效率,并存储在 vector<int> normals 中。
2. 计算裸奔效率 base
  • 遍历每个采样员的正常效率 normal
    • 计算采样效率浮动粒度 m = normal / 10
    • 如果没有志愿者协助,采样员的效率下降 2m,即效率为 8m
    • 8m 累加到 base 中,表示所有采样员的裸奔效率。
3. 计算新增效率 increase
  • 对于每个采样员,计算在志愿者协助下的新增效率:
    • 增加第1个志愿者时,新增效率为 2m
    • 增加第2个志愿者时,新增效率为 m
    • 增加第3个志愿者时,新增效率为 m
    • 增加第4个志愿者时,新增效率为 m
  • 将所有新增效率存储在 vector<int> increase 中。
4. 排序新增效率
  • 使用 sort() 函数对 increase 进行降序排序,确保优先选择新增效率最大的志愿者分配方案。
    • greater<int>() 是降序排序的比较函数。
5. 计算最高效率
  • 取前 y 个最大的新增效率:
    • 使用循环遍历前 y 个元素,并累加它们的值。
  • 将裸奔效率 base 与新增效率之和相加,得到最高效率。
6. 输出结果
  • 调用 getResult() 函数并打印结果。

示例解析

输入
3 2
100 200 300
运行结果
580
  • 解析
    • 采样员正常效率:[100, 200, 300]
    • 计算每个采样员的 m 值:
      • 第1个采样员:m = 100 / 10 = 10
      • 第2个采样员:m = 200 / 10 = 20
      • 第3个采样员:m = 300 / 10 = 30
    • 计算裸奔效率 base
      • 第1个采样员:8 * 10 = 80
      • 第2个采样员:8 * 20 = 160
      • 第3个采样员:8 * 30 = 240
      • base = 80 + 160 + 240 = 480
    • 计算新增效率 increase
      • 第1个采样员:[20, 10, 10, 10]
      • 第2个采样员:[40, 20, 20, 20]
      • 第3个采样员:[60, 30, 30, 30]
      • increase = [20, 10, 10, 10, 40, 20, 20, 20, 60, 30, 30, 30]
    • increase 降序排序:
      • increase = [60, 40, 30, 30, 30, 20, 20, 20, 10, 10, 10, 10]
    • 取前 y = 2 个最大的新增效率:
      • 60 + 40 = 100
    • 计算最高效率:
      • ans = base + 100 = 480 + 100 = 580

总结

  • 该代码通过计算裸奔效率和新增效率,结合排序和累加操作,高效地计算了最高效率。
  • 时间复杂度主要取决于排序操作,为 O(n log n),其中 n 是新增效率的数量。
  • 代码逻辑清晰,注释详细,易于理解和扩展。

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

六、贪心思维解法

解题思路详细分析

问题背景

给定 x 个采样员和 y 个志愿者,每个采样员有一个基准效率 N,采样员的效率会根据志愿者的数量变化。具体规则如下:

  • 每个采样员需要至少一个志愿者才能发挥正常效率 N
  • 每增加一个志愿者,效率提升 10%,最多提升 30%
  • 如果没有志愿者,效率下降 20%

目标是最大化总检测效率。

解题思路
情况 1:志愿者数量少于采样员 (y < x)
  1. 初始分配

    • 将志愿者优先分配给效率最高的采样员,每个采样员分配一个志愿者。
    • 如果志愿者数量不足以分配给所有采样员,部分采样员将没有志愿者,效率下降 20%
  2. 优化分配

    • 计算每个采样员在增加一个志愿者时的效率提升。
    • 从效率提升最大的采样员开始,逐步分配剩余的志愿者,直到没有剩余志愿者或所有采样员都已分配到志愿者。
    • 如果高效率的采样员已经提升 30%,则考虑下一个高效率的采样员。
情况 2:志愿者数量不少于采样员 (y >= x)
  1. 初始分配

    • 每个采样员分配一个志愿者,确保所有采样员都能发挥正常效率 N
    • 计算剩余的志愿者数量 y - x
  2. 优化分配

    • 优先将剩余的志愿者分配给效率最高的采样员,每个采样员最多增加 3 个志愿者。
    • 如果剩余的志愿者数量超过 3x,则超出部分的志愿者没有效率提升作用,可以忽略。
    • 计算每个采样员在增加一个志愿者时的效率提升。
    • 从效率提升最大的采样员开始,逐步分配剩余的志愿者,直到没有剩余志愿者或所有采样员都已提升 30%
  3. 进一步优化

    • 如果还有剩余志愿者,考虑剥夺低效率采样员的志愿者,分配给高效率的采样员。
    • 只要高效率采样员增加的 10% 效率可以大于低效率采样员减少的 20% 效率,就进行调整。
详细步骤
  1. 计算每个采样员的初始效率

    • 没有志愿者时,效率为 N * 0.8
    • 有一个志愿者时,效率为 N
  2. 收集每个采样员的新增效率数据

    • 增加第一个志愿者,新增效率 N * 0.2
    • 增加第二个志愿者,新增效率 N * 0.1
    • 增加第三个志愿者,新增效率 N * 0.1
    • 增加第四个志愿者,新增效率 N * 0.1
  3. 构建新增效率列表

    • 将每个采样员的新增效率数据收集到一个列表 add 中。
  4. 降序排序

    • add 列表进行降序排序,确保优先选择新增效率最高的组合。
  5. 分配志愿者

    • 情况 1:志愿者数量少于采样员
      • 优先分配给效率最高的采样员,确保每个采样员至少有一个志愿者。
      • 逐步分配剩余志愿者,直到没有剩余志愿者或所有采样员都已分配到志愿者。
    • 情况 2:志愿者数量不少于采样员
      • 每个采样员分配一个志愿者,确保所有采样员都能发挥正常效率。
      • 优先将剩余的志愿者分配给效率最高的采样员,每个采样员最多增加 3 个志愿者。
      • 如果还有剩余志愿者,考虑剥夺低效率采样员的志愿者,分配给高效率的采样员。
  6. 计算总效率

    • 将所有采样员的最终效率相加,得到总最快检测效率。

通过上述步骤,我们可以高效地计算出总最快检测效率,确保在不同情况下都能找到最优的志愿者分配方案。

以下是 JavaScriptJavaPython 三种语言的代码实现,附带详细的中文注释和逻辑讲解。这些代码的核心逻辑是相同的,只是语言语法不同。


JavaScript 代码

代码实现

const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});const lines = [];
rl.on("line", (line) => {lines.push(line);if (lines.length === 2) {const [x, y] = lines[0].split(" ").map(Number); // 采样员人数 x,志愿者人数 yconst arrX = lines[1].split(" ").map(Number); // 每个采样员的正常效率console.log(getResult(arrX, x, y)); // 调用算法并输出结果lines.length = 0; // 清空输入缓存}
});/*** 计算最高效率* @param {number[]} arr 每个采样员的正常效率* @param {number} x 采样员人数* @param {number} y 志愿者人数* @returns {number} 最高效率*/
function getResult(arr, x, y) {// 按照正常效率降序排序arr.sort((a, b) => b - a);let max = 0; // 记录最高效率let count = 0; // 记录当前采样员已经分配的额外志愿者数量let i, j; // 双指针,i 指向高效率采样员,j 指向低效率采样员// 如果志愿者少于采样员if (y < x) {// 0~y-1 范围内的高效率采样员优先获得一个志愿者,保持正常效率// y~x-1 范围内的低效率采样员没有志愿者,效率下降 20%for (let k = 0; k < x; k++) {max += k < y ? arr[k] : arr[k] * 0.8;}i = 0; // 指向高效率采样员j = y - 1; // 指向低效率采样员}// 如果志愿者不少于采样员else {// 如果志愿者人数超过采样员四倍,则多出来的志愿者无效if (y >= 4 * x) {y = 4 * x;}// 每个采样员都默认分配一个志愿者,发挥正常效率max = arr.reduce((p, c) => p + c, 0);// surplus 记录多出来的志愿者数量let surplus = y - x;i = 0; // 指向高效率采样员j = x - 1; // 指向低效率采样员// 优先将多出来的志愿者分配给高效率的采样员while (surplus > 0) {max += arr[i] * 0.1; // 每个额外志愿者提升 10% 效率surplus--;if (++count === 3) {count = 0; // 每个采样员最多分配 3 个额外志愿者i++;}}}// 多出来的志愿者分配完后,继续考虑剥夺低效率采样员的志愿者给高效率的采样员while (i < j) {// 如果最高效率采样员提升 10% 的效率 > 最低效率采样员下降 20% 的效率if (arr[i] * 0.1 > arr[j] * 0.2) {max += arr[i] * 0.1 - arr[j] * 0.2; // 更新最高效率if (++count === 3) {count = 0; // 每个采样员最多分配 3 个额外志愿者i++;}j--;} else {break; // 如果不值得剥夺,则退出循环}}return Math.floor(max); // 返回最高效率(取整)
}

Java 代码

代码实现

import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int x = sc.nextInt(); // 采样员人数int y = sc.nextInt(); // 志愿者人数Integer[] arrX = new Integer[x];for (int i = 0; i < x; i++) {arrX[i] = sc.nextInt(); // 每个采样员的正常效率}System.out.println(getResult(arrX, x, y)); // 调用算法并输出结果}/*** 计算最高效率* @param arr 每个采样员的正常效率* @param x 采样员人数* @param y 志愿者人数* @return 最高效率*/public static int getResult(Integer[] arr, int x, int y) {// 按照正常效率降序排序Arrays.sort(arr, (a, b) -> b - a);int max = 0; // 记录最高效率int count = 0; // 记录当前采样员已经分配的额外志愿者数量int i, j; // 双指针,i 指向高效率采样员,j 指向低效率采样员// 如果志愿者少于采样员if (y < x) {// 0~y-1 范围内的高效率采样员优先获得一个志愿者,保持正常效率// y~x-1 范围内的低效率采样员没有志愿者,效率下降 20%for (int k = 0; k < x; k++) {max += k < y ? arr[k] : (int) (arr[k] * 0.8);}i = 0; // 指向高效率采样员j = y - 1; // 指向低效率采样员}// 如果志愿者不少于采样员else {// 如果志愿者人数超过采样员四倍,则多出来的志愿者无效if (y >= 4 * x) {y = 4 * x;}// 每个采样员都默认分配一个志愿者,发挥正常效率for (Integer val : arr) {max += val;}// surplus 记录多出来的志愿者数量int surplus = y - x;i = 0; // 指向高效率采样员j = x - 1; // 指向低效率采样员// 优先将多出来的志愿者分配给高效率的采样员while (surplus > 0) {max += arr[i] * 0.1; // 每个额外志愿者提升 10% 效率surplus--;if (++count == 3) {count = 0; // 每个采样员最多分配 3 个额外志愿者i++;}}}// 多出来的志愿者分配完后,继续考虑剥夺低效率采样员的志愿者给高效率的采样员while (i < j) {// 如果最高效率采样员提升 10% 的效率 > 最低效率采样员下降 20% 的效率if (arr[i] * 0.1 > arr[j] * 0.2) {max += arr[i] * 0.1 - arr[j] * 0.2; // 更新最高效率if (++count == 3) {count = 0; // 每个采样员最多分配 3 个额外志愿者i++;}j--;} else {break; // 如果不值得剥夺,则退出循环}}return max; // 返回最高效率}
}

Python 代码

代码实现

# 输入获取
x, y = map(int, input().split())  # 采样员人数 x,志愿者人数 y
arr = list(map(int, input().split()))  # 每个采样员的正常效率# 算法入口
def getResult(arr, x, y):# 按照正常效率降序排序arr.sort(reverse=True)maxV = 0  # 记录最高效率count = 0  # 记录当前采样员已经分配的额外志愿者数量i, j = None, None  # 双指针,i 指向高效率采样员,j 指向低效率采样员# 如果志愿者少于采样员if y < x:# 0~y-1 范围内的高效率采样员优先获得一个志愿者,保持正常效率# y~x-1 范围内的低效率采样员没有志愿者,效率下降 20%for k in range(x):maxV += arr[k] if k < y else int(arr[k] * 0.8)i = 0  # 指向高效率采样员j = y - 1  # 指向低效率采样员# 如果志愿者不少于采样员else:# 如果志愿者人数超过采样员四倍,则多出来的志愿者无效if y >= 4 * x:y = 4 * x# 每个采样员都默认分配一个志愿者,发挥正常效率maxV = sum(arr)# surplus 记录多出来的志愿者数量surplus = y - xi = 0  # 指向高效率采样员j = x - 1  # 指向低效率采样员# 优先将多出来的志愿者分配给高效率的采样员while surplus > 0:maxV += arr[i] * 0.1  # 每个额外志愿者提升 10% 效率surplus -= 1count += 1if count == 3:count = 0  # 每个采样员最多分配 3 个额外志愿者i += 1# 多出来的志愿者分配完后,继续考虑剥夺低效率采样员的志愿者给高效率的采样员while i < j:# 如果最高效率采样员提升 10% 的效率 > 最低效率采样员下降 20% 的效率if arr[i] * 0.1 > arr[j] * 0.2:maxV += arr[i] * 0.1 - arr[j] * 0.2  # 更新最高效率count += 1if count == 3:count = 0  # 每个采样员最多分配 3 个额外志愿者i += 1j -= 1else:break  # 如果不值得剥夺,则退出循环return int(maxV)  # 返回最高效率(取整)# 算法调用  
print(getResult(arr, x, y))  

总结

  • 核心逻辑
    1. 将采样员按正常效率降序排序。
    2. 根据志愿者数量是否足够,分配志愿者并计算效率。
    3. 如果志愿者不足,优先分配给高效率采样员。
    4. 如果志愿者有剩余,优先分配给高效率采样员,并考虑剥夺低效率采样员的志愿者。
  • 时间复杂度:主要取决于排序操作,为 O(n log n)
  • 空间复杂度O(n),用于存储采样员效率。

七、优先队列解法

优先队列解法详细分析

问题背景

给定 x 个采样员和 y 个志愿者,每个采样员有一个基准效率 N,采样员的效率会根据志愿者的数量变化。具体规则如下:

  • 每个采样员需要至少一个志愿者才能发挥正常效率 N
  • 每增加一个志愿者,效率提升 10%,最多提升 30%
  • 如果没有志愿者,效率下降 20%

目标是最大化总检测效率。

优先队列解法
  1. 初始化优先队列

    • 使用一个大顶堆(优先队列)来存储所有采样员。
    • 每个采样员的优先级是:该采样员新增一名志愿者所能提升的效率。
    • 初始时,所有采样员都没有志愿者,因此每个采样员新增一名志愿者时的效率提升为 base * 0.2
  2. 初始状态

    • 每个采样员的当前效率为 base * 0.8
    • 每个采样员的志愿者数量为 0
  3. 分配志愿者

    • 从优先队列中取出优先级最高的采样员(即新增一名志愿者提升效率最多的采样员)。
    • 为该采样员新增一名志愿者:
      • 如果该采样员已有志愿者数量为 0,则新增一名志愿者后,恢复为 base 效率。
      • 如果该采样员已有志愿者数量 <= 3,则新增一名志愿者后,其总效率增加 base * 0.1
      • 如果该采样员已有志愿者数量 > 3,则再新增一名志愿者不会带来效率提升,即新增效率为 0
  4. 更新优先队列

    • 更新该采样员的志愿者数量和总效率。
    • 将该采样员重新压入优先队列,进行排序。
  5. 结束条件

    • 当志愿者用完时,结束操作。
    • 当所有采样员都安排了 4 名志愿者时,结束操作。
  6. 计算总效率

    • 从优先队列中取出所有采样员,累加他们的总效率,得到总最快检测效率。
详细步骤
  1. 初始化

    • 创建一个大顶堆(优先队列)。
    • 将所有采样员的初始状态(当前效率、基准效率、志愿者数量)加入优先队列。
    • 每个采样员的优先级为 base * 0.2
  2. 分配志愿者

    • 当还有志愿者可用时,执行以下操作:
      • 从优先队列中取出优先级最高的采样员。
      • 为该采样员新增一名志愿者:
        • 如果该采样员已有志愿者数量为 0,则当前效率更新为 base
        • 如果该采样员已有志愿者数量 <= 3,则当前效率增加 base * 0.1
        • 如果该采样员已有志愿者数量 > 3,则当前效率不变。
      • 更新该采样员的志愿者数量。
      • 计算该采样员新增一名志愿者后的效率提升:
        • 如果该采样员已有志愿者数量 < 4,则效率提升为 base * 0.1
        • 如果该采样员已有志愿者数量 >= 4,则效率提升为 0
      • 将该采样员重新压入优先队列。
  3. 结束条件

    • 当志愿者用完时,结束操作。
    • 当所有采样员都安排了 4 名志愿者时,结束操作。
  4. 计算总效率

    • 从优先队列中取出所有采样员,累加他们的当前效率,得到总最快检测效率。

通过上述步骤,我们可以高效地计算出总最快检测效率,确保在不同情况下都能找到最优的志愿者分配方案。这种方法的时间复杂度主要由优先队列的操作决定,为 O(y * log(x)),其中 y 是志愿者的数量,x 是采样员的数量。

以下是 JavaScriptJavaPython 三种语言的代码实现,附带详细的中文注释和逻辑讲解。这些代码的核心逻辑是相同的,只是语言语法不同。


JavaScript 代码

代码实现

const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});const lines = [];
rl.on("line", (line) => {lines.push(line);if (lines.length === 2) {const [x, y] = lines[0].split(" ").map(Number); // 采样员人数 x,志愿者人数 yconst arrX = lines[1].split(" ").map(Number); // 每个采样员的正常效率console.log(getResult(arrX, x, y)); // 调用算法并输出结果lines.length = 0; // 清空输入缓存}
});/*** 计算最高效率* @param {number[]} arr 每个采样员的正常效率* @param {number} x 采样员人数* @param {number} y 志愿者人数* @returns {number} 最高效率*/
function getResult(arr, x, y) {// 大顶堆优先队列,堆顶元素总是:新增一个志愿者后,提升效率最多的采样员const pq = new PriorityQueue((a, b) => getAdd(b) - getAdd(a));// 将所有采样员加入优先队列,初始时采样员都不搭配志愿者for (let base of arr) {pq.offer(new Sample(base));}// 只要还有志愿者,就将其分配给采样员while (y > 0) {// 如果堆顶采样员已有四个志愿者,说明再增加志愿者也不会带来效率提升if (pq.size == 0 || pq.peek().volunteer == 4) break;// 取出堆顶采样员const s = pq.poll();// 为其新增一个志愿者,并提升相应效率s.total += getAdd(s);s.volunteer += 1;// 重新压入队列pq.offer(s);y--;}// 计算所有采样员的总效率let ans = 0;while (pq.size > 0) ans += pq.poll().total;return ans;
}/*** 采样员类*/
class Sample {constructor(base) {this.volunteer = 0; // 该采样员搭配的志愿者人数this.base = base; // 该采样员的基准效率this.total = base * 0.8; // 该采样员的搭配志愿者后的总效率,初始时采样员没有搭配志愿者,则效率只有 base * 0.8}
}/*** 计算采样员新增一个志愿者能提升的效率* @param {Sample} s 采样员对象* @returns {number} 新增效率*/
function getAdd(s) {// 如果当前采样员没有志愿者,则新增一名志愿者可以提升 base * 20% 的效率if (s.volunteer == 0) return s.base * 0.2;// 如果当前采样员搭配的志愿者数量小于等于 3 个,则新增一个志愿者可以提升 base * 10% 的效率else if (s.volunteer <= 3) return s.base * 0.1;// 如果当前采样员已有 4 个志愿者,则再新增一个志愿者不能提升效率else return 0;
}/*** 基于堆实现优先队列*/
class PriorityQueue {constructor(cpr) {this.queue = [];this.size = 0;this.cpr = cpr;}// 交换两个元素swap(i, j) {let tmp = this.queue[i];this.queue[i] = this.queue[j];this.queue[j] = tmp;}// 上浮操作swim() {let ch = this.queue.length - 1;while (ch !== 0) {let fa = Math.floor((ch - 1) / 2);const ch_node = this.queue[ch];const fa_node = this.queue[fa];if (this.cpr(ch_node, fa_node) < 0) {this.swap(ch, fa);ch = fa;} else {break;}}}// 下沉操作sink() {let fa = 0;while (true) {let ch_left = 2 * fa + 1;let ch_right = 2 * fa + 2;let ch_max;let ch_max_node;const fa_node = this.queue[fa];const ch_left_node = this.queue[ch_left];const ch_right_node = this.queue[ch_right];if (ch_left_node && ch_right_node) {if (this.cpr(ch_left_node, ch_right_node) <= 0) {ch_max = ch_left;ch_max_node = ch_left_node;} else {ch_max = ch_right;ch_max_node = ch_right_node;}} else if (ch_left_node && !ch_right_node) {ch_max = ch_left;ch_max_node = ch_left_node;} else if (!ch_left_node && ch_right_node) {ch_max = ch_right;ch_max_node = ch_right_node;} else {break;}if (this.cpr(ch_max_node, fa_node) < 0) {this.swap(ch_max, fa);fa = ch_max;} else {break;}}}// 向优先队列中加入元素offer(ele) {this.queue.push(ele);this.size++;this.swim();}// 取出最高优先级元素poll() {this.swap(0, this.queue.length - 1);this.size--;const ans = this.queue.pop();this.sink();return ans;}// 只使用最高优先级元素,不取出peek() {return this.queue[0];}
}

Java 代码

代码实现

import java.util.PriorityQueue;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int x = sc.nextInt(); // 采样员人数int y = sc.nextInt(); // 志愿者人数Integer[] arrX = new Integer[x];for (int i = 0; i < x; i++) {arrX[i] = sc.nextInt(); // 每个采样员的正常效率}System.out.println(getResult(arrX, x, y)); // 调用算法并输出结果}/*** 计算最高效率* @param arr 每个采样员的正常效率* @param x 采样员人数* @param y 志愿者人数* @return 最高效率*/public static int getResult(Integer[] arr, int x, int y) {// 大顶堆优先队列,堆顶元素总是:新增一个志愿者后,提升效率最多的采样员PriorityQueue<Sampler> pq = new PriorityQueue<>((a, b) -> (int) (getAdd(b) - getAdd(a)));// 将所有采样员加入优先队列,初始时采样员都不搭配志愿者for (int base : arr) {pq.offer(new Sampler(0, base));}// 只要还有志愿者,就将其分配给采样员while (y > 0) {// 如果堆顶采样员已有四个志愿者,说明再增加志愿者也不会带来效率提升if (pq.isEmpty() || pq.peek().volunteer == 4) break;// 取出堆顶采样员Sampler s = pq.poll();// 为其新增一个志愿者,并提升相应效率s.total += getAdd(s);s.volunteer += 1;// 重新压入队列pq.offer(s);y--;}// 计算所有采样员的总效率double ans = 0;while (!pq.isEmpty()) ans += pq.poll().total;return (int) ans;}/*** 计算采样员新增一个志愿者能提升的效率* @param s 采样员对象* @return 新增效率*/public static double getAdd(Sampler s) {// 如果当前采样员没有志愿者,则新增一名志愿者可以提升 base * 20% 的效率if (s.volunteer == 0) return s.base * 0.2;// 如果当前采样员搭配的志愿者数量小于等于 3 个,则新增一个志愿者可以提升 base * 10% 的效率else if (s.volunteer <= 3) return s.base * 0.1;// 如果当前采样员已有 4 个志愿者,则再新增一个志愿者不能提升效率else return 0;}
}/*** 采样员类*/
class Sampler {int volunteer = 0; // 该采样员搭配的志愿者人数double base = 0; // 该采样员的基准效率double total = 0; // 该采样员的搭配志愿者后的总效率public Sampler(int volunteer, double base) {this.volunteer = volunteer;this.base = base;this.total = base * 0.8; // 初始时采样员没有搭配志愿者,则效率只有 base * 0.8}
}

Python 代码

代码实现

import queue# 输入获取
x, y = map(int, input().split())  # 采样员人数 x,志愿者人数 y
arr = list(map(int, input().split()))  # 每个采样员的正常效率def getAdd(s):"""计算采样员新增一个志愿者能提升的效率:param s: 采样员对象:return: 新增效率"""if s.volunteer == 0:  # 如果当前采样员没有志愿者,则新增一名志愿者可以提升 base * 20% 的效率return s.base * 0.2elif s.volunteer <= 3:  # 如果当前采样员搭配的志愿者数量小于等于 3 个,则新增一个志愿者可以提升 base * 10% 的效率return s.base * 0.1else:  # 如果当前采样员已有 4 个志愿者,则再新增一个志愿者不能提升效率return 0class Sampler:def __init__(self, volunteer, base):"""采样员类:param volunteer: 该采样员搭配的志愿者人数:param base: 该采样员的基准效率"""self.volunteer = volunteerself.base = baseself.total = base * 0.8  # 初始时采样员没有搭配志愿者,则效率只有 base * 0.8def __lt__(self, other):# 基于大顶堆排序,优先级为:增加一名志愿者能提升的效率return getAdd(self) > getAdd(other)def getResult(arr, x, y):"""计算最高效率:param arr: 每个采样员的正常效率:param x: 采样员人数:param y: 志愿者人数:return: 最高效率"""# 优先队列pq = queue.PriorityQueue()# 将所有采样员加入优先队列,初始时采样员都不搭配志愿者for base in arr:pq.put(Sampler(0, base))# 只要还有志愿者,就将其分配给采样员while y > 0:# 如果堆顶采样员已有四个志愿者,说明再增加志愿者也不会带来效率提升if pq.qsize() == 0 or pq.queue[0].volunteer == 4:break# 取出堆顶采样员s = pq.get()# 为其新增一个志愿者,并提升相应效率s.total += getAdd(s)s.volunteer += 1# 重新压入队列pq.put(s)y -= 1# 计算所有采样员的总效率ans = 0while pq.qsize() > 0:ans += pq.get().totalreturn int(ans)# 算法调用
print(getResult(arr, x, y))

总结

  • 核心逻辑
    1. 使用优先队列(大顶堆)动态分配志愿者。
    2. 每次将志愿者分配给能提升效率最多的采样员。
    3. 每个采样员最多分配 4 个志愿者,超过后无法再提升效率。
  • 时间复杂度:主要取决于优先队列的操作,为 O(n log n)
  • 空间复杂度O(n),用于存储采样员对象。

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

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

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

相关文章

【AI日记】25.01.11 Weights Biases | AI 笔记 notion

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛&#xff1a;Forecasting Sticker Sales笔记&#xff1a;我的 AI 笔记主要记在两个地方 有道云笔记&#xff1a;数学公式和符号比较多的笔记notion&#xff1a;没什么数学公式的…

[免费]微信小程序(高校就业)招聘系统(Springboot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序(高校就业)招聘系统(Springboot后端Vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序(高校就业)招聘系统(Springboot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项目介绍…

《新闻大厦抢先版》V0.18.105+Dlcs官方学习版

《新闻大厦抢先版》官方版https://pan.xunlei.com/s/VODaeUn3v-ZWVvvmUMfo5AqWA1?pwdnhpz# 建造并不断优化新闻大楼&#xff0c;保障员工权益并及时赶上周日的印刷交期&#xff01; 招募并管理不同职业以登上成功的阶梯&#xff1a;记者、摄像师、勤杂工&#xff0c;除此以外…

1.两数之和--力扣

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 示例 1…

Kubernetes集群架构

Kubernetes集群架构 Kubernetes 集群架构控制平面组件kube-apiserveretcdkube-schedulerkube-controller-managercloud-controller-manager 节点组件kubeletkebe-proxy&#xff08;可选&#xff09;容器运行时 插件DNSWeb UI&#xff08;Dashboard&#xff09;容器资源监控集群…

Visual Studio 中增加的AI功能

前言&#xff1a; 人工智能的发展&#xff0c;在现在&#xff0c;编程技术的IDE里面也融合了AI的基本操做。本例&#xff0c;以微软的Visual Studio中的人工智能的功能介绍例子。 本例的环境&#xff1a; Visual Studio 17.12 1 AI 智能变量检测&#xff1a; 上图展示了一…

牛客网刷题 ——C语言初阶(6指针)——BC106 上三角矩阵判定

1. 题目描述——BC106 上三角矩阵判定 牛客网OJ题链接 描述 KiKi想知道一个n阶方矩是否为上三角矩阵&#xff0c;请帮他编程判定。上三角矩阵即主对角线以下的元素都为0的矩阵&#xff0c;主对角线为从矩阵的左上角至右下角的连线。 示例 输入&#xff1a; 3 1 2 3 0 4 5 0 0…

时序数据库InfluxDB—介绍与性能测试

目录 一、简述 二、主要特点 三、基本概念 1、主要概念 2、保留策略 3、连续查询 4、存储引擎—TSM Tree 5、存储目录 四、基本操作 1、Java-API操作 五、项目中的应用 六、单节点的硬件配置 七、性能测试 1、测试环境 2、测试程序 3、写入测试 4、查询测试 一…

备战蓝桥杯 队列和queue详解

目录 队列的概念 队列的静态实现 总代码 stl的queue 队列算法题 1.队列模板题 2.机器翻译 3.海港 双端队列 队列的概念 和栈一样&#xff0c;队列也是一种访问受限的线性表&#xff0c;它只能在表头位置删除&#xff0c;在表尾位置插入&#xff0c;队列是先进先出&…

DELTA并联机械手视觉方案荣获2024年度机器人应用典型案例奖

直击现场 2025年1月9日晚&#xff0c;2024深圳市机器人年度评选颁奖典礼在深圳市南山区圣淘沙酒店正式拉开帷幕。本次颁奖活动由中国科学院深圳先进技术研究院指导&#xff0c;深圳市机器人协会与《机器人与智能系统》杂志组织承办。 正运动公司受邀参与此次典礼&#xff0c;…

【Oracle篇】深入了解执行计划中的访问路径(含表级别、B树索引、位图索引、簇表四大类访问路径)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;从事IT领域✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(…

工业 4G 路由器赋能远程医疗,守护生命线

在医疗领域&#xff0c;尤其是偏远地区的医疗救治场景中&#xff0c;工业 4G 路由器正发挥着无可替代的关键作用&#xff0c;宛如一条坚韧的 “生命线”&#xff0c;为守护患者健康持续赋能。 偏远地区医疗资源相对匮乏&#xff0c;常常面临着专业医生短缺、诊疗设备有限等困境…

matlab编写分段Hermite插值多项式

文章目录 原理使用分段Hermite插值多项式原因公式第一类的两个插值积函数第二类的两个插值积函数 例题法一法二 代码分段 Hermite 插值的思路&#xff1a;分段 Hermite 插值多项式的构造&#xff1a;MATLAB 实现代码&#xff1a;结果如图&#xff1a;注归一化变量的作用&#x…

element ui前端小数计算精度丢失的问题如何解决?

文章目录 前言一、什么是精度丢失&#xff1f;产生精度丢失的原因如何避免或减少精度丢失的影响 二、实际项目开发实例举例以项目预算模块为例如何解决精度丢失 总结 前言 在《工程投标项目管理系统》项目开发中工程项目预算、成本管理、财务管理等模块的开发中不可避免的要和…

《分布式光纤测温:解锁楼宇安全的 “高精度密码”》

在楼宇建筑中&#xff0c;因其内部空间庞大&#xff0c;各类电器设施众多&#xff0c;如何以一种既高效又稳定&#xff0c;兼具低成本与高覆盖特性的方式&#xff0c;为那些关键线路节点开展温度监测&#xff0c;是目前在安全监测领域一项重点研究项目&#xff0c;而无锡布里渊…

油猴支持阿里云自动登陆插件

遇到的以下问题&#xff0c;都已在脚本中解决&#xff1a; 获取到的元素赋值在页面显示&#xff0c;但是底层的value并没有改写&#xff0c;导致请求就是获取不到数据元素的加载时机不定&#xff0c;尤其是弱网情况下&#xff0c;只靠延迟还是有可能获取不到&#xff0c;且登陆…

代码随想录算法训练营第3天(链表1)| 203.移除链表元素 707.设计链表 206.反转链表

一、203.移除链表元素 题目&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 视频&#xff1a;手把手带你学会操作链表 | LeetCode&#xff1a;203.移除链表元素_哔哩哔哩_bilibili 讲解&#xff1a;代码随想录 注意&#xff1a; 针对头结点和非头结点的…

如何实现多级缓存?

本文重点说一说在Java应用中&#xff0c;多级缓存如何实现。 多级缓存是比较常见的一种性能优化的手段&#xff0c;一般来说就是本地缓存分布式缓存。 本地缓存一般采用Caffeine和Guava&#xff0c;这两种是性能比较高的本地缓存的框架。他们都提供了缓存的过期、管理等功能。…

网工_网络体系结构

2024.01.09&#xff1a;网络工程学习笔记&#xff08;网工老姜&#xff09; 第1节 网络体系结构 1.1 计算机一切皆011.2 网络协议1.3 协议的分层模型1.4 主机1向主机2发送数据过程1.5 本章小结 1.1 计算机一切皆01 在计算机内部&#xff0c;所有的数据最终都是以01的方式存在的…

3DGabor滤波器实现人脸特征提取

import cv2 import numpy as np# 定义 Gabor 滤波器的参数 kSize 31 # 滤波器核的大小 g_sigma 3.0 # 高斯包络的标准差 g_theta np.pi / 4 # Gabor 函数的方向 g_lambda 10.0 # 正弦波的波长 g_gamma 0.5 # 空间纵横比 g_psi np.pi / 2 # 相位偏移# 生成 Gabor 滤…