Description
小张经常为了事情太多安排不开而苦恼。现在他手头有n项任务,每项任务都有一个开始时间和结束时间。要想完成一个任务必须从开始时间做到结束时间,并且同一时间小张只能进行一项任务。
小张想知道他最多可以完成几项任务。
Input
第一行一个整数表示小张手头任务的个数。
接下来n行,每行两个整数,表示任务的开始时间和结束时间。
Output
一行一个整数,表示小张最多可以完成几项任务
解题思路:
这是一个典型的贪心问题,记Li为第i个任务开始的时间,Ri为第i个任务结束的时间
由于一个任务越早结束,我们就可以有越多的选择余地,因此就能选择更多的任务
我们可以借用pair对每一个任务的结束时间进行排序(pair排序元素为first,故存的时候先存r后存l)
用重载运算符对r进行排序
这样从左到右遍历,如果遍历到的开始时间大于当前结束时间,就把他加上,结束时间改为遍历到的元素的结束时间,之后返回加了多少即可
代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 300010;
int n;
pair<int,int>p[N];
int main()
{
cin>>n;
for (int i = 1; i <= n; i ++ ) {
int x,y;
cin>>x>>y;
p[i]={y,x};
}
sort(p+1, p + n+1);
long long ans = 0, ed = -0x3f3f3f3f;
for (int i = 1; i <= n; i ++ )
if (ed <= p[i].second)
{
ans ++ ;
ed = p[i].first;
}
cout<<ans<<endl;
return 0;
}