【算法题】2895. 最小处理时间

题目:

你有 n 颗处理器,每颗处理器都有 4 个核心。现有 n * 4 个待执行任务,每个核心只执行 一个 任务。

给你一个下标从 0 开始的整数数组 processorTime ,表示每颗处理器最早空闲时间。另给你一个下标从 0 开始的整数数组 tasks ,表示执行每个任务所需的时间。返回所有任务都执行完毕需要的 最小时间 。

注意:每个核心独立执行任务。

示例 1:

输入:processorTime = [8,10], tasks = [2,2,3,1,8,7,4,5]
输出:16
解释:
最优的方案是将下标为 4, 5, 6, 7 的任务分配给第一颗处理器(最早空闲时间 time = 8),下标为 0, 1, 2, 3 的任务分配给第二颗处理器(最早空闲时间 time = 10)。
第一颗处理器执行完所有任务需要花费的时间 = max(8 + 8, 8 + 7, 8 + 4, 8 + 5) = 16 。
第二颗处理器执行完所有任务需要花费的时间 = max(10 + 2, 10 + 2, 10 + 3, 10 + 1) = 13 。
因此,可以证明执行完所有任务需要花费的最小时间是 16 。
示例 2:

输入:processorTime = [10,20], tasks = [2,3,1,2,5,8,4,3]
输出:23
解释:
最优的方案是将下标为 1, 4, 5, 6 的任务分配给第一颗处理器(最早空闲时间 time = 10),下标为 0, 2, 3, 7 的任务分配给第二颗处理器(最早空闲时间 time = 20)。
第一颗处理器执行完所有任务需要花费的时间 = max(10 + 3, 10 + 5, 10 + 8, 10 + 4) = 18 。
第二颗处理器执行完所有任务需要花费的时间 = max(20 + 2, 20 + 1, 20 + 2, 20 + 3) = 23 。
因此,可以证明执行完所有任务需要花费的最小时间是 23 。

提示:

1 <= n == processorTime.length <= 25000
1 <= tasks.length <= 10^5
0 <= processorTime[i] <= 10^9
1 <= tasks[i] <= 10^9
tasks.length == 4 * n

java代码:

class Solution {
    public int minOperations(String s1, String s2, int x) {
        char[] s = s1.toCharArray(), t = s2.toCharArray();
        int n = s.length, diff = 0;
        for (int i = 0; i < n; i++) {
            if (s[i] != t[i]) {
                diff ^= 1;
            }
        }
        if (diff > 0) {
            return -1;
        }
        int[][][] memo = new int[n][n + 1][2];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j <= n; j++) {
                Arrays.fill(memo[i][j], -1);// -1 表示没有计算过
            }
        }
        return dfs(n - 1, 0, 0, memo, s, t, x);
    }

    private int dfs(int i, int j, int preRev, int[][][] memo, char[] s, char[] t, int x) {
        if (i < 0) { // 递归边界
            return j > 0 || preRev > 0 ? Integer.MAX_VALUE / 2 : 0;
        }
        if (memo[i][j][preRev] != -1) { // 之前计算过
            return memo[i][j][preRev];
        }
        if ((s[i] == t[i]) == (preRev == 0)) { // 无需反转
            return dfs(i - 1, j, 0, memo, s, t, x);
        }
        int res = Math.min(dfs(i - 1, j + 1, 0, memo, s, t, x) + x, dfs(i - 1, j, 1, memo, s, t, x) + 1);
        if (j > 0) { // 可以免费反转
            res = Math.min(res, dfs(i - 1, j - 1, 0, memo, s, t, x));
        }
        return memo[i][j][preRev] = res; // 记忆化
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: “美赛各常用算法程序与参考代码.rar” 是一个包含美国大学生数学建模竞赛(MCM/ICM)各的常用算法程序和参考代码的压缩文件。这个文件是一个方便参赛者学习和使用的资源。 在这个压缩文件中,包含了各种常用的数学建模算法和模型的实现代码。这些算法和代码可以用于解决竞赛目中常见的问,如优化问、动态规划、图论等。 通过使用这些参考代码,参赛者可以了解到不同问的解决方法和实现过程。他们可以学习到如何将一个实际问抽象成数学模型,并通过算法解该模型的最优解。 这些参考代码还提供了对于不同问的解释和步骤说明,方便参赛者理解算法的原理和具体实现。参赛者可以通过阅读这些代码,了解到计算机程序如何应用于数学建模中,以及如何使用编程语言来实现数学算法。 同时,这些参考代码还提供了一些常用的数据结构和优化方法,如矩阵运算、线性规划等。这些方法可以帮助参赛者更好地组织和处理数据,提高解决问的效率。 总之,“美赛各常用算法程序与参考代码.rar” 是一个非常有价值的资源,可以帮助参赛者更好地理解和应用数学建模算法。通过学习和使用这些参考代码,参赛者可以提高他们的竞赛水平,并在竞赛中取得更好的成绩。 ### 回答2: 美赛各常用算法程序与参考代码.rar是一个压缩文件,其中包含了美赛中各个目常用的算法程序和参考代码。这个压缩文件中的内容非常丰富,涵盖了多种算法的实现和解思路。 在美赛中,不同的目可能要用到不同的算法来解决。这个压缩文件的目的就是为了方便参赛选手在解过程中能够快速地找到合适的算法程序和参考代码进行参考。 压缩文件中的内容可能包括但不限于以下几种算法程序和参考代码: 1. 数学模型建立与解:比如线性规划、整数规划、非线性规划等等。这些算法程序和参考代码能够帮助选手快速地建立问的数学模型,并通过相应的算法解出最优解。 2. 图论算法:比如最短路径算法(Dijkstra算法、Floyd-Warshall算法)、最小生成树算法(Prim算法、Kruskal算法)以及网络流算法(最大流最小算法等)。这些算法程序和参考代码能够帮助选手在解决与图相关的问时进行图的建模和解。 3. 数据处理和分析:比如排序算法(冒泡排序、快速排序、归并排序等)和查找算法(二分查找、哈希查找等)。这些算法程序和参考代码能够帮助选手对问中的数据进行有效的处理和分析。 总之,美赛各常用算法程序与参考代码.rar是一个非常有用的资源,它可以帮助选手更好地理解和解决美赛中的各种问。选手可以通过仔细研究其中的算法程序和参考代码,从而在解过程中提高效率,取得更好的成绩。 ### 回答3: 美赛各常用算法程序与参考代码.rar是一个压缩包文件,里面包含了美国大学生数学建模竞赛(Mathematical Contest in Modeling,简称MCM)各的常用算法程序和参考代码。 这个压缩包里的算法程序和代码是针对美赛各个目的特定而设计的,包含了解决问的基本思路和具体实现方式。 在美赛中,常用的算法程序包括但不限于以下几种: 1. 数学建模常用算法:包括线性规划、整数规划、非线性规划、动态规划、图论算法等,这些算法能够帮助解决与数学建模相关的问。 2. 数据处理算法:包括数据清洗、数据预处理、特征工程、数据可视化等算法,这些算法能够帮助处理和分析给定的数据集,为后续建模提供准备。 3. 模型评估与优化算法:包括交叉验证、参数调优、模型融合等算法,这些算法能够帮助评估模型的性能,并对模型进行进一步优化。 4. 编程语言和工具的使用:常见的编程语言如Python、R、MATLAB等及相关工具的使用,也是解决问过程中不可或缺的一部分。 通过学习和运用这些常用算法程序和参考代码,可以帮助我们更好地理解和解决美赛的各个目,提高我们在比赛中的建模水平和竞争力。相应的代码可以为我们提供思路和参考,节省解时间,使解过程更加高效和准确。所以,对于参加美赛的同学来说,熟悉并掌握这些算法程序和参考代码对于成功解答问是非常有帮助的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值