当前位置:   article > 正文

贪心算法实现最佳任务调度实验_任务调度问题一个单位时间任务是恰好需要一个单位时间完成的任务。给定一个单位时

任务调度问题一个单位时间任务是恰好需要一个单位时间完成的任务。给定一个单位时

题目描述

  一个单位时间任务是恰好需要一个单位时间完成的任务。给定一个单位时间任务的有限集S。关于S 的一个时间表用于描述S 中单位时间任务的执行次序。时间表中第1 个任务从时间0 开始执行直至时间1 结束,第2 个任务从时间1 开始执行至时间2 结束,…,第n个任务从时间n-1 开始执行直至时间n结束。具有截止时间和误时惩罚的单位时间任务时间表问题可描述如下:
     (1) n 个单位时间任务的集合S={1,2,…,n}(n≤500);
     (2) 任务 i 的截止时间d[i],1≤ i ≤n,1 ≤ d[i] ≤ n,即要求任务i在时间d[i]之前结束;
     (3) 任务 i 的误时惩罚1≤ w[i] < 1000,1 ≤ i ≤ n,即任务 i 未在时间d[i]之前结束将招致w[i]的惩罚;若按时完成则无惩罚。
  任务时间表问题要求确定S 的一个时间表(最优时间表)使得总误时惩罚达到最小。

输入数据

  第一行是正整数 n ,表示任务数。接下来的 2 行中,每行有 n 个正整数,分别表示各任务的截止时间和误时惩罚。

输出数据

        将计算出的最小总误时惩罚输出

样例输入

  1. 7
  2. 4 2 4 3 1 4 6
  3. 70 60 50 40 30 20 10

样例输出

50

解题思路

        为了达到最小的误时惩罚,按照贪心策略,要先去按时完成或提前完成惩罚较大的任务。若一个时间片上已经安排了按时完成的或者有着较大罚时的任务,那么,较小惩罚的任务则需要提前完成(该任务应放在紧邻的上一个时间片完成,若这个时间片也有任务,继续往前移,直到有空闲的时间片可以执行这个任务,否则,这个任务会带来罚时,就在返回的总罚时上加上这个罚时)。

代码实现

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. const int N = 1e5 + 10;
  5. int n;
  6. bool visited[N];
  7. struct Task
  8. {
  9. int d;
  10. int w;
  11. } task[N];
  12. bool cmp(Task &t1, Task &t2)
  13. {
  14. return t1.w > t2.w;
  15. }
  16. int main()
  17. {
  18. cin >> n;
  19. for (int i = 0; i < n; ++i) cin >> task[i].d;
  20. for (int i = 0; i < n; ++i) cin >> task[i].w;
  21. sort(task, task + n, cmp);
  22. int result = 0;
  23. for (int i = 0; i < n; ++i)
  24. {
  25. bool mark = false;
  26. for (int j = task[i].d; j > 0; --j)
  27. {
  28. if (!visited[j - 1])
  29. {
  30. visited[j - 1] = true;
  31. mark = true;
  32. break;
  33. }
  34. }
  35. if (!mark) result += task[i].w;
  36. }
  37. cout << result << endl;
  38. return 0;
  39. }
  40. /*
  41. 输入:
  42. 7
  43. 4 2 4 3 1 4 6
  44. 70 60 50 40 30 20 10
  45. 输出:
  46. 50
  47. */

ps:实验指导书上还有第二小问:将每个 Wi 替换为 max{W1,W2……Wn}-Wi 运行算法、比较并分析结果。(此处就是把w[i]修改一下即可,代码实现如下)

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. const int N = 1e5 + 10;
  5. int n;
  6. bool visited[N];
  7. struct Task
  8. {
  9. int d;
  10. int w;
  11. } task[N];
  12. bool cmp(Task &t1, Task &t2)
  13. {
  14. return t1.w > t2.w;
  15. }
  16. int main()
  17. {
  18. cin >> n;
  19. for (int i = 0; i < n; ++i) cin >> task[i].d;
  20. int max_w = 0;
  21. for (int i = 0; i < n; ++i)
  22. {
  23. cin >> task[i].w;
  24. max_w = max(max_w, task[i].w);
  25. }
  26. for (int i = 0; i < n; ++ i) task[i].w = max_w - task[i].w;
  27. sort(task, task + n, cmp);
  28. int result = 0;
  29. for (int i = 0; i < n; ++i)
  30. {
  31. bool mark = false;
  32. for (int j = task[i].d; j > 0; --j)
  33. {
  34. if (!visited[j - 1])
  35. {
  36. visited[j - 1] = true;
  37. mark = true;
  38. break;
  39. }
  40. }
  41. if (!mark) result += task[i].w;
  42. }
  43. cout << result << endl;
  44. return 0;
  45. }
  46. /*
  47. 输入:
  48. 7
  49. 4 2 4 3 1 4 6
  50. 70 60 50 40 30 20 10
  51. 输出:
  52. 10
  53. */

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/284798
推荐阅读
相关标签
  

闽ICP备14008679号