完成所有任务所需的最短时间(不改变任务顺序)


在这个问题中,我们需要根据给定的条件找到完成所有任务所需的总时间。

我们可以使用映射数据结构来解决这个问题。我们可以跟踪每个任务最后执行的时间,如果时间间隔小于K,我们可以相应地增加时间单位。

问题陈述 – 我们得到一个包含长度为N的字母字符的字符串task。每个字符代表一个任务,我们需要一个时间单位来执行任务。此外,条件是每个任务都应该以K个单位的时间间隔执行。这里,K是输入中给出的正整数。打印按给定顺序完成所有任务所需的总时间单位。

示例

输入– str = "BADBBC", K = 3

输出– 10

解释– 我们可以按给定顺序执行任务。

B -> A -> D -> _ -> B -> _ -> _ -> _ -> B -> C

这里,程序员可以观察到“_”代表单个时间单位,以跳过在3个时间间隔内执行相同任务。

输入– str = “RSTUV”, K = 2

输出– 5

解释我们可以按给定顺序执行任务。

R -> S -> T -> U -> V

输入– str = ‘HHHH’, K = 2

输出– 10

解释– 我们可以按给定顺序执行任务。

H -> _ -> _ -> H -> _ -> _ -> H -> _ -> _ -> H

方法一

在这种方法中,我们将每个任务最后执行的时间存储在哈希映射中。如果任何任务重复,并且当前时间和上次执行任务之间的时间间隔小于K,我们需要添加额外的时间单位以使时间间隔等于K。

算法

  • 定义名为“time”的无序映射来跟踪特定任务最后执行的时间单位。

  • 将“ans”初始化为零以存储总时间单位。

  • 遍历任务字符串。

  • 如果当前字符存在于映射中,则表示已执行相同的任务。

    • 从映射中查找上次执行当前任务的时间单位。如果“ans”(当前时间单位)和time[ch]之间的差小于K,我们需要按照下面给出的步骤4.2向ans添加一些时间单位。

    • 从K中减去ans - time[ch],然后向K加1。之后,将结果值添加到ans中。

  • 将“ans”的值存储在字符“ch”的映射中。

  • 将“ans”的值增加1。

  • 返回“ans”的值。

示例

#include <bits/stdc++.h>
using namespace std;
// function to find the minimum time required to complete the tasks according to the given conditions
int minimumTime(string tasks, int K){
    // Keeps track of the last time instant of each task
    unordered_map<char, int> time;
    // to keep track of the current time
    int ans = 0;
    // Traverse the given string
    for (char ch : tasks){
        // Check if the same task exists in the map
        if (time.find(ch) != time.end()){
            // If the same task exists and its last time instant is less than K, then update the time of the current task.
            if (ans - time[ch] <= K){
                ans += K - (ans - time[ch]) + 1;
            }
        }
        // Update the last time instant of the current task
        time[ch] = ans;
        // Increase the current time by 1
        ans++;
    }
    // return the minimum time required
    return ans;
}

int main(){
    string str = "BADBBC";
    int K = 3;
    cout << "The minimum time required to complete all tasks is " << minimumTime(str, K);
    return 0;
}

输出

The minimum time required to complete all tasks is 10

时间复杂度 – O(N),因为我们迭代字符串。

空间复杂度 – O(1),因为我们不使用任何动态空间。

更新于:2023年8月18日

浏览量:148

开启你的职业生涯

完成课程获得认证

开始学习
广告