原题https://www.luogu.org/problemnew/show/P1803
题解
题目的大意是给出比赛的开始和结束的时间,求解最多能参加多少场比赛。因为所有的比赛时间点在同一个时间轴上,所以结束时间越早的比赛就是必须参加的,那么我们可以通过结束时间点进行从大到小的排序。由于一个时间点只能参加一个比赛,那么就需要剔除时间上有交叉的比赛(剔除比赛时间较长的一个)。可以使用一个pos记录上一次参加比赛的结束时间,下一场比赛是否参加,只需要将pos与要参加的比赛的开始时间进行比较。只有小于等于的情况才参加。
#include<bits/stdc++.h>
using namespace std;
struct Match
{
int start;
int end;
}M[1000005];
bool cmp(Match a,Match b)
{
return a.end<b.end;
}
int main()
{
int n,i,j;
cin>>n;
for(i=0;i<n;i++) cin>>M[i].start>>M[i].end;
sort(M,M+n,cmp);
int pos=M[0].end;
int ans=1;//第一个区间必须选
for(i=1;i<n;i++)
{
if(pos<=M[i].start)
{
pos=M[i].end;
ans++;
}
}
cout<<ans;
return 0;
}