给定一个任务列表,每个任务有一个完成所需的时间和一个奖励值。现有若干个工人可以同时工作,但每个工人同一时间只能完成一个任务。要求设计一个任务分配方案,使得在所有任务都被分配并完成的情况下,总奖励值最大。采用贪心法来解决这个问题。 输入: 第一行输入两个整数n和m,分别表示任务数量和工人数量(1 ≤ n ≤ 1000, 1 ≤ m ≤ 100)。 接下来n行,每行两个整数ti和vi,分别表示第i个任务所需的时间ti和奖励值vi(1 ≤ ti, vi ≤ 1000)。 输出: 输出一个整数,表示在所有任务都被分配并完成的情况下,可以获得的最大总奖励值。
时间: 2025-06-25 17:01:30 浏览: 5
### C++ 实现多工人任务分配贪心算法
在解决多个工人并行工作的任务分配问题时,目标通常是最大化总奖励值。这种情况下可以采用贪心算法来优化任务与工人的匹配过程。
以下是基于贪心策略的一个可能实现方案:
#### 代码示例
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 定义结构体表示任务和工人
struct Task {
int reward; // 奖励值
int difficulty; // 难度
};
bool compareTasks(const Task& a, const Task& b) {
return a.reward > b.reward; // 按照奖励降序排列
}
bool compareWorkers(int a, int b) {
return a > b; // 工人能力按照降序排列
}
int maxTotalReward(vector<Task>& tasks, vector<int>& workers) {
// 对任务按奖励值降序排序
sort(tasks.begin(), tasks.end(), compareTasks);
// 对工人能力按降序排序
sort(workers.begin(), workers.end(), compareWorkers);
int totalReward = 0;
int taskIndex = 0; // 当前考虑的任务索引
for (auto worker : workers) {
// 尝试为当前工人找到最高奖励的任务
while (taskIndex < tasks.size() && tasks[taskIndex].difficulty > worker) {
taskIndex++;
}
if (taskIndex >= tasks.size()) break; // 如果没有更多可用任务
if (tasks[taskIndex].difficulty <= worker) {
totalReward += tasks[taskIndex].reward; // 分配该任务给工人
taskIndex++; // 移动到下一个任务
}
}
return totalReward;
}
int main() {
// 输入样例数据
vector<Task> tasks = {{10, 5}, {20, 8}, {15, 6}}; // 奖励值和难度
vector<int> workers = {4, 7, 9}; // 工人能力
int result = maxTotalReward(tasks, workers);
cout << "最大化的总奖励值: " << result << endl;
return 0;
}
```
#### 解释
上述代码实现了如下逻辑:
1. **输入定义**:`tasks` 是一个包含任务的向量,其中每个任务由其 `reward` 和 `difficulty` 组成;`workers` 则是一个整型数组,代表每位工人的能力。
2. **排序操作**:先对任务列表依据奖励值进行降序排序[^1],再对工人列表依据能力值进行降序排序[^2]。
3. **贪心分配**:对于每一位工人,尝试为其分配剩余未被分配的任务中具有最高奖励且满足难度条件的任务。如果找不到合适的任务,则跳过此工人。
4. **返回结果**:最终累加所有成功分配任务的奖励值得到总奖励值。
通过这种方式能够有效利用资源,在有限条件下达到最优解的目标。
---
阅读全文
相关推荐









