活动安排–经典贪心区间
来源:牛客网
https://ac.nowcoder.com/acm/contest/950/A
经典的贪心区间问题:
区间(ai,bi) (aj,bj) …
需要得到更多的区间,即:
1.以右端点升序排列所有区间
-------------------------------->区间长度从小到大<-------------------------------------
2.选中第一个区间,从第二个区间开始(遍历),只要符合两个区间不相交(bi<aj)即可
--------------------------->使得即从小到大,又从左到右<----------------------------
如此 短区间 在左 较长区间在右,达到最多数目区间
#include <iostream>
#include <algorithm>
using namespace std;
//
typedef pair<int, int> P;
const int N = 1100;
P p[N];
//升序排序
bool cmp(P a, P b) {
return a.second < b.second;
}
//
int main()
{
ios::sync_with_stdio, cin.tie(0), cout.tie(0);
int n;
while (cin >> n)
{
for (int i = 0; i < n; ++i)
cin >> p[i].first >> p[i].second;
//
sort(p, p + n, cmp);
//首先选取首个区间
int k = p[0].second;
int ans = 1;
for (int i = 1; i < n; ++i)
{//不相交即可符合要求
if (k <= p[i].first) {
k = p[i].second;
++ans;
}
}
cout << ans << '\n';
}
return 0;
}