c++写代码有n个任务在k个可并行工作的机器上执行。每个任务需要执行t时间,请你设计一个算法,找出完成这n个任务的最佳调度,使得完成全部任务的时间最短。 输入 测试样例由多组测试数据组成。 每个样例包含两行,第一行输入两个正整数n和k; 第二行输入n个整数ti,表示每个任务需要运行的时间。 1 <= n,k <= 20,1 <= ti <= 100 输出 对每个测试例,输出一行,表示结果。
时间: 2024-02-18 19:04:04 浏览: 181
好的,我可以为您提供一个基于贪心算法的解决方案。
首先,我们可以将每个任务按照所需时间从大到小排序。接着,我们创建一个长度为 k 的数组,分别表示 k 台机器当前已经分配任务的总时间。对于每个任务,我们将其分配给当前总时间最小的机器,使得任务能够尽快地完成。具体地,我们可以维护一个最小堆,每次将任务分配给堆顶对应的机器,然后更新堆顶元素的值。
以下是 C++ 代码实现:
```c++
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int main() {
int n, k;
while (cin >> n >> k) {
vector<int> tasks(n);
for (int i = 0; i < n; i++) {
cin >> tasks[i];
}
sort(tasks.begin(), tasks.end(), greater<int>());
priority_queue<int, vector<int>, greater<int>> pq;
for (int i = 0; i < k; i++) {
pq.push(0);
}
for (int i = 0; i < n; i++) {
int t = pq.top();
pq.pop();
t += tasks[i];
pq.push(t);
}
int ans = 0;
while (!pq.empty()) {
ans = pq.top();
pq.pop();
}
cout << ans << endl;
}
return 0;
}
```
该算法的时间复杂度为 O(nlogk),其中 n 表示任务数量,k 表示机器数量。
阅读全文