题目描述
设有 n个活动的集合 E={1,2,..,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动 i 都有一个要求使用该资源的起始时间 si和一个结束时间 fi,且 si<fi。如果选择了活动 i ,则它在时间区间 [si,fi) 内占用资源。若区间 [si,fi) 与区间 [sj,fj)不相交,则称活动 i 与活动 j 是相容的。也就是说,当 fi≤sj 或 fj≤si 时,活动 i 与活动 j 相容。选择出由互相兼容的活动组成的最大集合。
输入格式
第一行一个整数 n;
接下来的 n 行,每行两个整数 si 和 fi。
输出格式
输出互相兼容的最大活动个数。
样例
样例输入
4
1 3
4 6
2 5
1 7
样例输出
2
数据范围与提示
1≤n≤1000
区间调度问题。贪心算法。在可选的活动中每次都选取结束时间最早的活动。
AC代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
int n;
cin>>n;
pair<int,int> acti[1001];
for(int i=1;i<=n;i++)
{
//为了让结束时间早的活动排在前面,把结束时间存入first,把开始时间存入second
int s,f;
cin>>s>>f;
acti[i].first=f;
acti[i].second=s;
}
sort(acti+1,acti+n+1);//对pair进行的是字典序比较
//t是最后所选活动的结束时间,ans是互相兼容的最大活动个数
int ans=0,t=0;
for(int i=1;i<=n;i++)
{
if(t<=acti[i].second)
{
ans++;
t=acti[i].first;
}
}
cout<<ans;
}