活动安排是较为简单的贪心算法,有很多类似的问题可以类推的
设有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;
}