c++ 现在有n个任务,每一个任务有一个开始时间和结束时间,同时这个任务也有一定的利润,现在想让你合理去安排这些任务的,问能获得的最大利润是多少? 注意:同一时刻只能做一个任务,一个任务结束时刻可以开始下一个任务。代码
时间: 2024-09-07 13:03:41 浏览: 35
一个免费的c++小游戏集合
5星 · 资源好评率100%
这个问题是一个典型的贪心算法问题,通常称为任务调度问题或活动选择问题。解决这个问题的关键在于选择结束时间最早的未完成任务。可以按照以下步骤解决:
1. 创建一个任务列表,包含所有任务的开始时间、结束时间和利润。
2. 将所有任务按照结束时间进行排序,如果结束时间相同,则按照利润进行降序排序。
3. 从第一个任务开始,依次选择结束时间最早且不与已选择的任务冲突的任务,并累加这些任务的利润。
4. 最后得到的累加利润即为最大利润。
下面是一个简单的C++代码示例实现这个算法:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
// 定义任务结构体
struct Task {
int start;
int finish;
int profit;
};
// 按照结束时间排序,如果结束时间相同则按照利润降序排序
bool compareTasks(const Task &a, const Task &b) {
if (a.finish != b.finish) return a.finish < b.finish;
return a.profit > b.profit;
}
// 计算最大利润
int calculateMaxProfit(std::vector<Task>& tasks) {
// 按结束时间排序任务
std::sort(tasks.begin(), tasks.end(), compareTasks);
int n = tasks.size();
int maxProfit = 0;
int lastFinishTime = -1;
// 遍历所有任务
for (int i = 0; i < n; i++) {
if (tasks[i].start >= lastFinishTime) {
maxProfit += tasks[i].profit;
lastFinishTime = tasks[i].finish;
}
}
return maxProfit;
}
int main() {
// 示例任务列表
std::vector<Task> tasks = {{1, 3, 50}, {2, 5, 100}, {4, 6, 10}, {6, 7, 20}};
// 计算最大利润
std::cout << "The maximum profit is " << calculateMaxProfit(tasks) << std::endl;
return 0;
}
```
在这个示例中,我们首先定义了一个`Task`结构体来存储每个任务的开始时间、结束时间和利润。接着,我们定义了一个比较函数`compareTasks`来帮助排序任务。`calculateMaxProfit`函数实现贪心算法的主要逻辑,而`main`函数中提供了一个示例任务列表,并调用`calculateMaxProfit`来计算并打印最大利润。
阅读全文