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

问题描述:

所谓“钟点秘书”,是指年轻白领女性利用工余时间为客户提供秘书服务,并按钟点收取酬金。“钟点秘书”为客户提供有偿服务的方式一般是:采用电话、电传、上网等“遥控”式服务,或亲自到客户公司处理部分业务。其服务对象主要有三类:一是外地前来考察商务经营、项目投资的商人或政要人员,他们由于初来乍到,急需有经验和熟悉本地情况的秘书帮忙;二是前来开展短暂商务活动,或召开小型资讯发布会的国外客商;三是本地一些请不起长期秘书的企、事业单位。这些客户普遍认为:请“钟点秘书”,一则可免去专门租楼请人的大笔开销;二则可根据开展的商务活动请有某方面专长的可用人才;三则由于对方是临时雇用关系,工作效率往往比固定的秘书更高。据调查,在上海“钟点秘书”的行情日趋看好。对此,业内人士认为:为了便于管理,各大城市有必要组建若干家“钟点秘书服务公司”,通过会员制的形式,为众多客户提供规范、优良、全面的服务,这也是建设国际化大都市所必需的。某跨国公司总裁正分身无术,为一大堆会议时间表焦头烂额,希望高级钟点秘书能做出合理的安排,能在有限的时间内召开更多的会议。

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

问题分析:

会议安排问题是典型的贪心算法,要得到最多安排的会议数,我们有3种贪心策略,按会议最早开始,按会议持续时间最短,按会议最早结束,按会议最早开始可能会有一个会议从早上8点到晚上,持续时间最短,有可能会议开始时间晚导致得不到最优解,按第三种最早结束策略,能得到最优解,如果两个会议结束时间相等,就按最晚开始排序,这样持续时间最短。最优解包括了子问题的最优解,符合最优子结构的性质。

代码:

  1. #include <iostream>
  2. #include <algorithm>
  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. }
     

猜你喜欢

转载自blog.csdn.net/qq_40327837/article/details/85076806