Advertisement

高级钟点秘书(会议安排)

阅读量:

问题描述:

即指年轻白领女性在空闲时间为其提供秘书服务并按小时付费的服务模式。

简而言之:最之间段内开最多的会议,但是会议和会议之间要相容

问题分析:

解决会期安排问题通常采用贪心算法策略。我们的目标是尽可能多地安排更多的会议。具体实现时通常会采用以下三种不同的贪心准则:按照最早的开始时间排序、按照较短的时间段优先考虑以及按照结束时间最早的顺序来处理各次会议。然而,在实际应用中可能出现的情况是:比如某个活动可能会占用从早上8点到深夜的时间段,并且由于其持续时间较短可能会导致最终得到的安排并不是最佳方案。另一种常见的策略是按照结束时间最早的顺序来处理各次会议,并且当有两个或多个活动同时在某一时刻完成时,则按照它们最晚开始的时间来进行排序。这种情况下能够保证所获得的结果确实是最优解,并且这种最优解也包含在各个子问题中的最优解之中,并满足优化子结构这一特性。

代码:

  1. #include
  2. #include
  3. using namespace std;
  4. const int MAX = 100;//最大会议数
  5. struct meet
  6. {
  7. int id;
  8. int begin;
  9. int end;
  10. }meets[MAX];
  11. //如果会议结束时间相等,就按会议开始时间从大到小排序
  12. bool cmp(const meet s1, const meet s2)
  13. {
  14. if (s1.end == s2.end)
  15. {
  16. return s1.begin > s2.begin;
  17. }
  18. return s1.end < s2.end;
  19. }
  20. int main()
  21. {
  22. int num, s, e, i;
  23. cin >> num;
  24. for (i = 0; i < num; i++)
  25. {
  26. cin >> s >> e;
  27. meets[i].begin = s, meets[i].end = e, meets[i].id = i + 1;
  28. }
  29. sort(meets, meets + num, cmp);
  30. int ans = 1, lastTime = meets[0].end;
  31. cout << meets[0].id;
  32. for (i = 0; i < num; i++)
  33. {
  34. if (meets[i].begin > lastTime)
  35. {
  36. ans++;
  37. lastTime = meets[i].end;
  38. cout << " " << meets[i].id;
  39. }
  40. }
  41. cout << endl;
  42. cout << ans << endl;
  43. return 0;
  44. }

全部评论 (0)

还没有任何评论哟~