题目描述:设有n个活动的集合,其中每个活动都要求使用同一个资源,而在同一时间内只有一个活动能够使用这一资源,每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi(si<fi),如果选择了活动i,则他在时间区间[si,fi)占用资源。求最多可以进行多少个活动。
【输入格式】第一行一个正整数n(n<1000),接下来n行,每行两个整数si和fi
【输出格式】输出尽可能多的相互兼容的活动个数
贪心策略:首先需要以每个活动的结束时间为基准排序(很多问题都需要排序,我们只能在有序中确定策略,凌乱的数据中确定策略显然是梦话。对于这个问题有两个可能的基准:开始时间和结束时间,然后再选择思考顺序:从前往后和从后往前),这里我们选择从前往后思考(至于为什么是这样只能说在思考问题的过程中试出来这样可以解决问题)。
然后从前往后选择活动,如果不冲突就选上。
正确性:对于两个冲突的活动,选择前面的更优:前面的结束时间更早,对后面的影响更小。
对于两个不冲突活动,就选上,活动数更多。
综上:策略正确
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,cnt,t;
struct node
{int s,f;
}a[1005];
bool cmp(node a,node b)
{return a.f<b.f;
}
int main()
{scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d%d",&a[i].s,&a[i].f);}sort(a,a+n,cmp);t=0; cnt=0;for(int i=0;i<n;i++){if(a[i].s>=t){t=a[i].f;cnt++;}}printf("%d",cnt);return 0;
}