一、题意
有一个会议室,同一时间只能用来开一次会。
输入若干会议时间区间,输出这个会议室最多能安排多少场会议。
二、解析
经典的区间不相交问题。
由贪心思想:我们希望选出一个区间后,能留下来更长一些的时间长度(这样才有可能选出更多的区间),因此我们按照时间区间的结束点进行从小到大排序,总是先选取最先完成的会议。
三、代码
#include <iostream> #include <vector> #include <algorithm> #define mp make_pair using namespace std; int kase; vector<pair<int, int> > vec; int main() { cin >> kase; while(kase --) { int x, y; vec.clear(); while(cin >> x >> y && (x || y)) vec.push_back(mp(x, y)); sort(vec.begin(), vec.end(), [](const pair<int, int>& a, const pair<int, int>& b) { return a.second < b.second; }); int ans = 0, cur = 0; for(const auto & p : vec) if(p.first >= cur) ans ++, cur = p.second; cout << ans << endl; } }
四、归纳
- 区间问题之区间不相交问题:按右端点排列,然后总是先选取最先完成的时间区间。