苍茫大地一剑尽挽破,何处繁华笙歌落。斜倚云端千壶掩寂寞,纵使他人空笑我。
这个题,就是一个模板,有兴趣的,可以去我博客贪心算法--最大会议数这篇文章中看,代码不差毫分,那里面有详解。
题目描述
设有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(1≤n≤1000);
接下来的n行,每行两个整数si和fi。
输出
输出互相兼容的最大活动个数。
样例输入
复制样例数据
4 1 3 4 6 2 5 1 7
样例输出
2
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define inf 0x3f3f3f3f
typedef long long LL;
using namespace std;
struct node
{
int beg;
int en;
int num;
}hy[1010];
//类
class setmeet
{
public:
void init();//初始化
void solve();
private:
int n,ans;
};
void setmeet::init()
{
int s,e;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&s,&e);
hy[i].beg=s;
hy[i].en=e;
hy[i].num=i+1;
}
}
bool cmp(node x,node y)
{
if(x.en==y.en)
return x.beg>y.beg;
return x.en<y.en;//按结束时间排序,若结束时间相同,则按开始时间晚的排序
}
void setmeet::solve()
{
sort(hy,hy+n,cmp);
ans=1;
int last=hy[0].en;
for(int i=1;i<n;i++)
{
if(hy[i].beg>=last)
{
ans++;
last=hy[i].en;
}
}
printf("%d\n",ans);
}
int main()
{
setmeet sm;
sm.init();
sm.solve();
return 0;
}