算法:截止日期

贪心算法:截止日期问题

【问题描述】

某学科老师布置了n个题目,每个题目都有相应的分数及截止日期。各个题目的分数及截止日期可能并不相同。对某题目而言,如果在该题目的截止日期前完成则可获得对应的分数,否则无法得分。假设每个题目均需要花费一天的时间来完成,这期间无法完成其他题目。请你设计算法指定题目的完成计划,从而使总的得分最大。

下面给出一个包含了7个题目及相应的分数、截止日期的实例:
在这里插入图片描述
对该实例而言,得分最大的作业完成方案为花费4天时间依次完成题目2,6,3,7。得分为15。
【输入形式】

输入数据第一行为一个整数n (0 <= n <= 10000), 表示题目数目
之后n行各有两个整数, 第i行为 pi, di (1 <= pi, di <= 10000),分别表示第i个题目的分数和截止时间

【输出形式】

一个整数, 为当前条件下的最大得分

【样例输入】

4 
50 2 
10 1 
20 2 
30 1

【样例输出】

80

【问题解答】

  1. 基于贪心算法的思路,一个大问题首先分解为各个小问题,最优解由局部最优解得来,小问题之间没有相互关联。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的贪心算法截止日期问题的C++代码示例: ```c++ #include <iostream> #include <algorithm> #include <vector> using namespace std; struct Task { int id, deadline, profit; }; bool cmp(Task a, Task b) { return a.profit > b.profit; // 按照利润从大到小排序 } void scheduleTasks(vector<Task>& tasks) { sort(tasks.begin(), tasks.end(), cmp); int n = tasks.size(); vector<int> slot(n, -1); int profit = 0; for(int i=0; i<n; i++) { for(int j=min(n, tasks[i].deadline)-1; j>=0; j--) { if(slot[j] == -1) { // 如果该时间点可用 slot[j] = tasks[i].id; // 安排该任务 profit += tasks[i].profit; // 计算利润 break; } } } cout << "最大利润:" << profit << endl; cout << "安排的任务:"; for(int i=0; i<n; i++) { if(slot[i] != -1) { cout << slot[i] << " "; } } cout << endl; } int main() { int n; cout << "输入任务个数:" << endl; cin >> n; vector<Task> tasks(n); cout << "输入每个任务的截止日期和利润:" << endl; for(int i=0; i<n; i++) { tasks[i].id = i+1; cin >> tasks[i].deadline >> tasks[i].profit; } scheduleTasks(tasks); return 0; } ``` 该代码使用了一个结构体 `Task` 来表示每个任务的属性,其中包括任务编号、截止日期和利润。通过自定义比较函数 `cmp` 将任务按照利润从大到小排序。然后,使用一个 `vector` 来表示每个时间点是否被占用,初始化为 -1 表示该时间点可用。接着,从前往后遍历任务列表,对于每个任务,从该任务的截止日期开始往前找,找到第一个可用时间点,并将该任务安排在该时间点。最后,计算总利润和输出安排的任务列表。 注意,该代码中贪心策略是按照利润从大到小排序,优先安排利润高的任务。如果有多个任务的利润相同,则安排截止日期早的任务。这种贪心策略可能不是最优的,但可以得到一个近似最优解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值