说明
根据第三条亲和性调度原则,必须选择同一链路剩余可用的处理器数量为4个的环
python解法
- 解题思路:
- 这个问题是关于处理一个数组 arr,并根据给定的数字 num 对该数组进行不同方式的调度。调度的方式依赖于以下几个步骤:
初始化与分组:首先将输入数组 arr 排序,然后将数组中的元素分成两个子列表 link1 和 link2,其中 link1 包含所有小于4的元素,link2 包含所有大于等于4的元素。
调度规则:根据输入的 num 值,决定如何处理这两个子列表:
num = 1:选择长度为 1、2、3 或 4 的组合进行调度。
num = 2:选择长度为 2、3 或 4 的组合进行调度。
num = 4:只调度长度为 4 的子列表。
num = 8:如果 link1 和 link2 都有长度为 4 的元素,将它们合并并进行调度。
深度优先搜索(DFS):使用递归的 DFS 方法来枚举 link1 和 link2 中所有可能的子集组合,根据 num 的值来决定每次深度遍历的层数。每次递归都会生成不同长度的组合,并最终返回所有可能的调度结果。
class ProcessorScheduler:
def __init__(self, arr, num):
self.arr = sorted(arr)
self.num = num
self.link1 = []
self.link2 = []
self.result = []
def split_links(self):
for e in self.arr:
if e < 4:
self.link1.append(e)
else:
self.link2.append(e)
def schedule(self):
self.split_links()
len1 = len(self.link1)
len2 = len(self.link2)
if self.num == 1:
self._schedule_one(len1, len2)
elif self.num == 2:
self._schedule_two(len1, len2)
elif self.num == 4:
self._schedule_four(len1, len2)
elif self.num == 8:
self._schedule_eight(len1, len2)
return self.result
def _schedule_one(self, len1, len2):
if len1 == 1 or len2 == 1:
if len1 == 1:
self._dfs(self.link1, 1)
if len2 == 1:
self._dfs(self.link2, 1)
elif len1 == 3 or len2 == 3:
if len1 == 3:
self._dfs(self.link1, 1)
if len2 == 3:
self._dfs(self.link2, 1)
elif len1 == 2 or len2 == 2:
if len1 == 2:
self._dfs(self.link1, 1)
if len2 == 2:
self._dfs(self.link2, 1)
elif len1 == 4 or len2 == 4:
if len1 == 4:
self._dfs(self.link1, 1)
if len2 == 4:
self._dfs(self.link2, 1)
def _schedule_two(self, len1, len2):
if len1 == 2 or len2 == 2:
if len1 == 2:
self._dfs(self.link1, 2)
if len2 == 2:
self._dfs(self.link2, 2)
elif len1 == 4 or len2 == 4:
if len1 == 4:
self._dfs(self.link1, 2)
if len2 == 4:
self._dfs(self.link2, 2)
elif len1 == 3 or len2 == 3:
if len1 == 3:
self._dfs(self.link1, 2)
if len2 == 3:
self._dfs(self.link2, 2)
def _schedule_four(self, len1, len2):
if len1 == 4:
self.result.append(self.link1)
if len2 == 4:
self.result.append(self.link2)
def _schedule_eight(self, len1, len2):
if len1 == 4 and len2 == 4:
self.result.append(self.link1 + self.link2)
def _dfs(self, arr, level):
path = []
self._dfs_helper(arr, 0, level, path)
def _dfs_helper(self, arr, index, level, path):
if len(path) == level:
self.result.append(path[:])
return
for i in range(index, len(arr)):
path.append(arr[i])
self._dfs_helper(arr, i + 1, level, path)
path.pop()
if __name__ == "__main__":
arr = eval(input())
num = int(input())
scheduler = ProcessorScheduler(arr, num)
print(scheduler.schedule())
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
java解法
- 解题思路
- 该题目要求根据给定的数组和一个调度级别 num,从数组中生成符合条件的组合。具体而言,数组中的元素根据大小被分为两组:link1(包含小于 4 的元素)和 link2(包含大于等于 4 的元素)。根据不同的调度级别 num,选择合适的组合方式:
调度级别为 1 或 2:
从 link1 和 link2 中分别生成大小为 num 的所有组合。
调度级别为 4:
如果 link1 或 link2 中有正好 4 个元素,将其加入结果。
调度级别为 8:
如果 link1 和 link2 都有 4 个元素,则将两者合并,并将合并后的结果加入到结果中。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Integer[] arr = Arrays.stream(sc.nextLine().split("[\\[\\]\\,\\s]"))
.filter(str -> !"".equals(str))
.map(Integer::parseInt)
.toArray(Integer[]::new);
int num = sc.nextInt();
System.out.println(findProcessorCombinations(arr, num));
}
public static List<List<Integer>> findProcessorCombinations(Integer[] arr, int num) {
List<List<Integer>> result = new ArrayList<>();
List<Integer> link1 = new ArrayList<>();
List<Integer> link2 = new ArrayList<>();
for (int p : arr) {
if (p < 4) {
link1.add(p);
} else {
link2.add(p);
}
}
if (num == 1 || num == 2) {
findCombinations(link1, num, result);
findCombinations(link2, num, result);
} else if (num == 4) {
if (link1.size() == 4) result.add(new ArrayList<>(link1));
if (link2.size() == 4) result.add(new ArrayList<>(link2));
} else if (num == 8 && link1.size() == 4 && link2.size() == 4) {
List<Integer> combined = new ArrayList<>(link1);
combined.addAll(link2);
result.add(combined);
}
return result;
}
private static void findCombinations(List<Integer> link, int num, List<List<Integer>> result) {
if (link.size() >= num) {
backtrack(link, new ArrayList<>(), 0, num, result);
}
}
private static void backtrack(List<Integer> link, List<Integer> current, int start, int num, List<List<Integer>> result) {
if (current.size() == num) {
result.add(new ArrayList<>(current));
return;
}
for (int i = start; i < link.size(); i++) {
current.add(link.get(i));
backtrack(link, current, i + 1, num, result);
current.remove(current.size() - 1);
}
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
C++解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
C解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
JS解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
题目整理、思路解题不易,如对您有帮助,欢迎点赞/收藏 O(∩_∩)O
评论记录:
回复评论: