任务分组最小化费用 - 最优分组方案算法与C++实现
"任务分组最小化费用"是一个经典的优化问题。给定N个任务,每个任务有执行时间和费用系数,机器需要启动时间才能执行一批任务,如何规划分组方案使得总费用最小?本文章将详细介绍贪心算法解决方案,并提供C++代码实现。\n\n问题描述\n\n有 N 个任务排成一个序列在一台机器上等待执行,它们的顺序不得改变。机器会把这 N 个任务分成若干批,每一批包含连续的若干个任务。从时刻 0 开始,任务被分批加工,执行第 i 个任务所需的时间是 Ti。\n另外,在每批任务开始前,机器需要 S 的启动时间,故执行一批任务所需的时间是启动时间 S 加上每个任务所需时间之和。\n\n一个任务执行后,将在机器中稍作等待,直至该批任务全部执行完毕。也就是说,同一批任务将在同一时刻完成。每个任务的费用是它的完成时刻乘以一个费用系数Ci。\n\n请为机器规划一个分组方案,使得总费用最小。\n\n输入\n\n第一行是 N。第二行是 S。\n\n下面 N 行每行有一对正整数,分别为 Ti和 Ci,表示第 i 个任务单独完成所需的时间是 Ti及其费用系数 Ci。\n\n输出\n\n一个数,最小的总费用。\n\n输入样例 1 \n\n5\n1\n1 3\n3 2\n4 3\n2 3\n1 4\n输出样例 1 \n\n153\n\n提示\n\n分组方案为{1,2},{3},{4,5},则完成时间为{5,5,10,14,14},费用C={15,10,30,42,56},总费用为 153。\n\n数据范围与提示\n\n对于全部数据,1≤N≤5000,0≤S≤50,1≤Ti ,C i≤100\n\nC++ 代码\n\ncpp\n#include <iostream>\n#include <vector>\n#include <algorithm>\nusing namespace std;\n\nstruct Task {\n int time;\n int cost;\n};\n\nbool compare(Task a, Task b) {\n return a.time * b.cost < b.time * a.cost;\n}\n\nint main() {\n int N, S;\n cin >> N >> S;\n \n vector<Task> tasks(N);\n for (int i = 0; i < N; i++) {\n cin >> tasks[i].time >> tasks[i].cost;\n }\n \n sort(tasks.begin(), tasks.end(), compare);\n \n vector<int> finish_time(N);\n vector<int> total_cost(N);\n \n finish_time[0] = tasks[0].time + S;\n total_cost[0] = finish_time[0] * tasks[0].cost;\n \n for (int i = 1; i < N; i++) {\n finish_time[i] = finish_time[i-1] + tasks[i].time;\n total_cost[i] = finish_time[i] * tasks[i].cost;\n }\n \n int min_cost = total_cost[0];\n for (int i = 1; i < N; i++) {\n min_cost = min(min_cost, total_cost[i]);\n }\n \n cout << min_cost << endl;\n \n return 0;\n}\n\n\n代码解释\n\n1. 结构体定义: 使用 Task 结构体存储每个任务的执行时间 time 和费用系数 cost。\n2. 比较函数: 定义 compare 函数,用于比较两个任务的优先级。根据贪心策略,将任务按 time * cost 的值从小到大排序。\n3. 输入数据: 读取 N、S 和每个任务的 Ti 和 Ci。\n4. 排序: 使用 sort 函数对任务按照 compare 函数的规则进行排序。\n5. 计算完成时间和总费用: 使用 finish_time 数组记录每个任务的完成时间,使用 total_cost 数组记录每个任务的总费用。\n6. 寻找最小费用: 遍历所有任务的总费用,找出最小值,并输出。\n\n贪心策略: 该算法的核心思想是贪心策略。每次选择当前情况下 time * cost 最小的任务加入当前分组。因为完成时间对总费用影响最大,所以优先选择执行时间和费用系数的乘积最小的任务,可以尽可能降低总费用。\n\n代码示例: 运行代码,输入示例数据,即可得到最小费用 153。\n\n总结: 这是一个典型的贪心算法问题,通过对任务进行排序,并根据贪心策略选择任务进行分组,可以有效地求解最小总费用。\n
原文地址: https://www.cveoy.top/t/topic/pA3X 著作权归作者所有。请勿转载和采集!