[算法题] 安排会议室——贪心算法的应用

xiaoxiao2021-02-28  85

题目描述

[题目描述]

在大公司里,会议是很多的,开会得有场子,要场子你得先在电子流里预订。如果你是项目组新来的小弟,那么恭喜你,每天抢订会议室的任务就光荣的分给你了。老大要求你尽可能多的订会议室,但是这些会议室之间不能有时间冲突。[Input]input文件中可以包括多个测试案例。T(T ≤ 20),输入文件的第一行表示文件中有多少个测试案例。N(1 ≤ N ≤ 500),每个测试案例的第一行表示会议室的数目。每个测试案例中,除第一行以外表示各个会议室的信息。每行会有3个数字,分别表示会议编号、会议起始时间、会议结束时间。[Output]输出可以安排的最大会议数目[I/O Example]Input261 1 102 5 63 13 154 14 175 8 146 3 12151 4 82 2 53 2 64 4 65 2 36 1 67 4 78 3 59 3 810 1 211 1 712 2 413 5 614 4 515 7 8Output35

 

练习模板

#include <cstdio> #include <iostream> using  namespace std; int main( int argc,  char** argv) {      int tc, T;     cin >> T;      for(tc =  0; tc < T; tc++)     {          // TO DO here     }      return  0; // Your program should return 0 on normal termination. }

 

代码实现

题目中要求会议时间不可以冲突,所以可以利用贪心算法,尽可能的选择会议时间结束较早的会议室,这样就能安排最多的会议室。

#include <cstdio> #include <iostream> #include <vector> #include <algorithm> using  namespace std; class MeetingRoom { public:      int index;      int start;      int end; public:     MeetingRoom( int i,  int s,  int e) : index(i), start(s), end(e) {} }; bool isEndEarly( const MeetingRoom r1,  const MeetingRoom r2) {      return (r1.end < r2.end); } int main( int argc,  char** argv) {      int tc, T;      int num =  0;      int count =  0;      int index =  0;      int start =  0;      int end =  0;     vector<MeetingRoom> rooms;     freopen( " input.txt "" r ", stdin);     cin >> T;      for(tc =  0; tc < T; tc++)     {         rooms.clear();  //  clear vector         //  get all the info of rooms         cin >> num;          for ( int i =  0; i < num; i++) {             cin >> index >> start >> end;             MeetingRoom room(index, start, end);             rooms.push_back(room);         }          //  sort rooms for end time         sort(rooms.begin(), rooms.end(), isEndEarly);          //  use greedy algorithm to solve promblem         count =  1;         MeetingRoom prev = rooms[ 0];          for (vector<MeetingRoom>::iterator it = rooms.begin() +  1; it != rooms.end(); it++) {             MeetingRoom current = *it;              if (current.start >= prev.end) {                 count++;                 prev = current;             }         }         cout << count << endl;     }      return  0; }

 

转载请注明原文地址: https://www.6miu.com/read-65484.html

最新回复(0)