Task
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1679 Accepted Submission(s): 428
Problem Description
Today the company has m tasks to complete. The ith task need xi minutes to complete. Meanwhile, this task has a difficulty level yi. The machine whose level below this task’s level yi cannot complete this task. If the company completes this task, they will get (500*xi+2*yi) dollars.
The company has n machines. Each machine has a maximum working time and a level. If the time for the task is more than the maximum working time of the machine, the machine can not complete this task. Each machine can only complete a task one day. Each task can only be completed by one machine.
The company hopes to maximize the number of the tasks which they can complete today. If there are multiple solutions, they hopes to make the money maximum.
The company has n machines. Each machine has a maximum working time and a level. If the time for the task is more than the maximum working time of the machine, the machine can not complete this task. Each machine can only complete a task one day. Each task can only be completed by one machine.
The company hopes to maximize the number of the tasks which they can complete today. If there are multiple solutions, they hopes to make the money maximum.
Input
The input contains several test cases.
The first line contains two integers N and M. N is the number of the machines.M is the number of tasks(1 < =N <= 100000,1<=M<=100000).
The following N lines each contains two integers xi(0<xi<1440),yi(0=<yi<=100).xi is the maximum time the machine can work.yi is the level of the machine.
The following M lines each contains two integers xi(0<xi<1440),yi(0=<yi<=100).xi is the time we need to complete the task.yi is the level of the task.
The first line contains two integers N and M. N is the number of the machines.M is the number of tasks(1 < =N <= 100000,1<=M<=100000).
The following N lines each contains two integers xi(0<xi<1440),yi(0=<yi<=100).xi is the maximum time the machine can work.yi is the level of the machine.
The following M lines each contains two integers xi(0<xi<1440),yi(0=<yi<=100).xi is the time we need to complete the task.yi is the level of the task.
Output
For each test case, output two integers, the maximum number of the tasks which the company can complete today and the money they will get.
Sample Input
1 2 100 3 100 2 100 1
Sample Output
1 50004
题意:
给出 N(1 ~ 100000)部机器,M (1 ~ 100000)个任务,每个任务只能由一部机器完成,每个机器只能完成一个任务,当机器的时间和难度值都大于任务的时间和难度值才能去完成任务。后给出 N 部机器的难度值和 M 部机器的时间和难度值。问如何安排能使完成的任务数最多且同样多的情况下获得的钱数最多。每次完成一个任务则获得 500 * 时间 + 2 * 难度值 的钱。
思路:
贪心。时间从大到小排序后,用任务去选择机器,挑出所有时间大于任务时间的机器中难度值大于任务且难度值最小的机器去完成。因为难度值最大才有 100,所以可以用数组统计机器的数量。记得钱数是 long long 的。
AC:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int MAX = 100005; typedef struct { int time, level; } node; node machine[MAX], task[MAX]; int level[105]; bool cmp (node a, node b) { if (a.time != b.time) return a.time > b.time; return a.level > b.level; } int main() { int n, m; while (~scanf("%d%d", &n, &m)) { for (int i = 0; i < n; ++i) { scanf("%d%d", &machine[i].time, &machine[i].level); } for (int i = 0; i < m; ++i) { scanf("%d%d", &task[i].time, &task[i].level); } sort(machine, machine + n, cmp); sort(task, task + m, cmp); memset(level, 0, sizeof(level)); int ans = 0, mm = 0; ll sum = 0; for (int i = 0; i < m; ++i) { while (mm != n && machine[mm].time >= task[i].time) { ++level[ machine[mm].level ]; ++mm; } for (int k = task[i].level; k <= 100; ++k) { if (level[k] > 0) { --level[k]; ++ans; sum += (ll)(task[i].time * 500 + 2 * task[i].level); break; } } } printf("%d %I64d\n", ans, sum); } return 0; }
相关推荐
Independent Task Scheduling
贪心算法是一种解决问题的策略,它通过每一步都选择局部最优解来期望得到全局最优解。在这个场景下,我们将在C++环境下使用贪心法解决多机调度问题。 贪心算法的基本思想是每次面对决策时,都采取在当前状态下最好...
贪心算法是一种在每一步选择中都采取当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。这种策略通常不保证能得到全局最优解,但可以得到局部最优解,适用于一些特定的问题。在给定的...
贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。贪心算法不一定能产生整体最优解,因为它通常没有回溯功能。贪心算法的正确性通常依赖于...
- 提出了两种近似算法:一种是基于贪心策略的方法,另一种是基于博弈论的方法。这两种方法都能在每个批次处理过程中保证结果的近似界限。 4. **实验评估**:通过在真实数据集和合成数据集上的广泛实验,验证了提出...
云计算中融入贪心策略的调度算法研究,周舟,胡志刚,鉴于Min-Min算法优先调度小任务而Max-Min算法优先调度大任务而导致云系统资源不平衡的问题,提出了一种新的算法叫Min-Max. Min-Max算法对时
4. **优化算法**:可以采用遗传算法、模拟退火算法、贪心算法等优化方法,寻找全局最优或近似最优的调度方案,以最小化网络IO代价。 5. **并行性和容错性**:同时考虑任务的并行执行和容错机制,确保在降低网络IO...
2. **数据结构与算法**:比萨相关的任务可能涉及到存储和操作订单、配料、库存等数据,这可能需要用到数组、链表、字典、树等数据结构,以及排序、搜索、贪心算法等。 3. **文件操作**:如果任务涉及读写文件,...
文件名为`task-scheduler`,很可能包含了用于读取任务数据、执行贪心调度算法以及输出结果的函数。 6. **测试与优化**:通过不同的任务集进行测试,检查算法是否能够达到预期的效果,并根据实际情况进行优化。 ...
为了提高效率,可能采用了启发式或近似算法,例如贪心算法、遗传算法、粒子群优化等。这些算法在复杂性和计算速度之间寻找平衡,能够在有限的时间内找到接近最优的解。 总的来说,这个MATLAB项目为理解和实践任务...
题目描述 123.买卖股票的最佳时机 III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意: 你不能同时参与多笔交易(你...
标题 "algo_task" 提供的信息比较有限,但我们可以推测这可能是一个关于算法任务的项目或者学习资源。在 IT 领域,算法是解决问题或执行特定计算过程的精确步骤,通常与编程语言如Python紧密相关。Python 是一种流行...
标题 "tsp-task" 暗示我们正在讨论一个与旅行商问题(Travelling Salesman Problem, TSP)相关的任务。旅行商问题是一个经典的优化问题,在运筹学和计算机科学中广泛研究。该问题的基本设定是:一个销售员需要访问n...
爬山算法是一种简单的贪心搜索算法,这个算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到找到一个局部最优解。而其有一个主要的缺陷,即该算法会陷入因搜索到局部最优解,而无法搜索到全局最优解的...
本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了 三个简单、两个中等、一个困难 等级的题目,共计三十道题,利用三十天的时间完成这组刻意练习。...
贪心算法是一种简单的搜索策略,每次都选取当前看起来最优的操作,但在机器翻译中,它并不总是能确保全局最优解。这是因为翻译中的决策依赖于整个句子的上下文,而贪心策略只考虑当前位置的最佳选择,不考虑未来的...