Description
勤劳的老杨最近收到了一个任务清单,在这个清单上有 n 项不同的工作任务。对于每一项任务都给出了两个时间 [x,y] ,其中 x 表示任务的起始时间(任务从第 x 天开始,包含第 x 天),y 表示任务的结束时间(任务到第 y 天结束,包含第 y 天)。 认真的老杨对待每一项任务都是一心一意的。一旦他决定做某一项任务,在该任务没有完成之前他不会同时再做另一项任务,也就是说在任意时刻老杨手头最多只有一项任务。 假设完成每一项任务所获得的报酬都是相等的。那么,老杨应该如何来安排自己的时间才可以得到最多的报酬呢? 请你编写一个程序帮老杨计算出他最多可以完成的任务数量。保证至少能完成一项任务。
Input
单组输入。
第 1 行输入一个正整数 n(n<=200000) 表示任务清单上任务的总数。
第 2 行至第 n+1 行每一行包含两个正整数x,y ,分别表示每一项任务的开始时间和结束时间,两个正整数之间用空格隔开,保证 1<= x,y<=10^9。
Output
输出老杨最多可以完成的任务数量。
Sample Input
7
1 4
1 3
2 7
3 4
4 6
5 10
7 8
Sample Output
3
HINT
对于输入样例,最多可以完成的任务数量为 3,对应 [1, 3] (第 2 项任务),[4, 6] (第 5 项任务)和 [7, 8] (第 7 项任务)这三项任务。
解析:结构体排序,根据结束时间点来排,越早结束排越前面,越早结束,所剩时间就越多,也就最可能完成更多任务,注意任务时间不能重合,小于任务开始时间才可以。
#include <bits/stdc++.h>
using namespace std;
struct su
{
int a,b;
bool operator<(const su&x)const{
return b<x.b; //结束越早,排越前面
}
}arr[200005];
int main()
{
int n,i,cnt=1,t; //cnt记录完成任务数量
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d%d",&arr[i].a,&arr[i].b);
sort(arr,arr+n);
t=arr[0].b; //t记录当前任务完成时间点
for(i=1;i<n;i++){
if(t<arr[i].a) cnt++,t=arr[i].b; //小于下个任务开始时间,可接受该任务,更新t
}
printf("%d\n",cnt);
return 0;
}