vr网站建设,网站辅助导航,广州公司注册资本减资流程及步骤,网站推广途径有哪些题目描述
给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行#xff0c;并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间#xff0c;CPU 可以完成一个任务#xff0c;或者处于待命状态…题目描述
给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间CPU 可以完成一个任务或者处于待命状态。
然而两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间因此至少有连续 n 个单位时间内 CPU 在执行不同的任务或者在待命状态。
你需要计算完成所有任务所需要的 最短时间 。
示例 1
输入tasks [A,A,A,B,B,B], n 2
输出8
解释A - B - (待命) - A - B - (待命) - A - B在本示例中两个相同类型任务之间必须间隔长度为 n 2 的冷却时间而执行一个任务只需要一个单位时间所以中间出现了待命状态。 示例 2
输入tasks [A,A,A,B,B,B], n 0
输出6
解释在这种情况下任何大小为 6 的排列都可以满足要求因为 n 0
[A,A,A,B,B,B]
[A,B,A,B,A,B]
[B,B,B,A,A,A]
...
诸如此类示例 3
输入tasks [A,A,A,A,A,A,B,C,D,E,F,G], n 2
输出16
解释一种可能的解决方案是A - B - C - A - D - E - A - F - G - A - (待命) - (待命) - A - (待命) - (待命) - A提示
1 task.length 104tasks[i] 是大写英文字母n 的取值范围为 [0, 100]
解答
class Solution {
public:int leastInterval(vectorchar tasks, int n) {// 42 参考:popopop解答// 建立大小为n 1的桶子行,如等待时间n 2,A任务数为6即建立6个桶每个容量为3// A| | |// A| | |// A| | |// A| | |// A| | |// A| | |// 设现在没其他任务完成A的所需时间是 (6 - 1)*3 1 16,因为最后的桶不存在等待时间// A| | |// A| | |// A| | |// A| | |// A| | |// A|x|x|// 接下来添加其他任务// A|B|C|// A|B|C|// A|B| |// A|B| |// A|B| |// A|B| |// 可看出C并没对总体时间产生影响因为被安排在其他任务冷却期中// 而B和A数量相同导致最后一个桶需多执行一次B任务总时间为 (6 - 1)*3 2 17// 总结可得 总排队时间 (桶个数 - 1)*(n 1) 最后一桶任务数// 若在下方状态下还要执行两次F任务// A|B|C|// A|B|C|// A|B|D|// A|B|D|// A|B|D|// A|B|x|// 可临时扩充桶子大小// A|B|C|F|// A|B|C|F|// A|B|D|// A|B|D|// A|B|D|// A|B|x|// 计算方法为// 1.记录任务最大数量N 并且计算任务数量并列最多的任务有多少即最后一个桶子任务数// 计算 num1 (N - 1) * (n 1) x// 2. num2 tasks.size(), 输出其中较大值即可应为存在空闲时间必然是num1大 不存在空闲时间有num2 num1int len tasks.size();vectorint vec(26);// 统计每次任务次数for(char c : tasks) vec[c - A];// 降序排列sort(vec.begin(), vec.end(), [](int x, int y) { return x y; });int cnt 1;// vec[0] 是次数最多的任务// cnt计算任务数量并列最多的数量// n1是每个桶大小while(cnt vec.size() vec[cnt] vec[0]) cnt;return max(len, cnt (n 1) * (vec[0] -1));}
};