活动安排是较为简单的贪心算法,有很多类似的问题可以类推的 

设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si<fi。如果选择了活动i,则它在半开时间区间[si,fi)内占用资源。若区间[[si,fi)与区间[sj,fj)不相交,则称活动i与活动j是相容的。也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。选择出由相互兼容的活动组成的最大集合。

输入

第1行一个整数n(n≤1000),接下来n行,每行两个整数si和fi。

输出 

输出尽可能多的互相兼容的活动个数。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
pair <ll,ll>a[1005];
bool cmp(pair<int,int>a,pair<int,int>b)
{
     return a.second<b.second;
}
int main()
{
	ll N;
	cin>>N;
	for(int i=0;i<N;i++)
	{
		cin>>a[i].first>>a[i].second;
	}
	sort(a,a+N,cmp);//先对数组以结束时间为关键字进行升序的排序
	int res=1,compare=a[0].second;
	while(1)
	{
	     int flag=0;
		for(int i=0;i<N;i++)
		{
			
		  if(a[i].first>=compare)
		  {
		  	compare=a[i].second;
		  	res++;
		  	flag=1;
		  }
			
		}
		if(!flag) break;
	}
	cout<<res<<endl;
	
}