P1803 凌乱的yyy / 线段覆盖 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
解题思路
1.创建结构体变量,储存每个比赛的开始和结束时间
2.为了使参加的比赛尽可能多,所以必须参加最早结束的比赛,用sort函数将数组按结束时间排序
3.创建变量m为上一个num,m最初为1,num储存最小大于等于结束时间的比赛,num最初为2。m=1,因为第一项结束时间最早;num=2,使得下一个结束时间最早,这样才能得到最优解
4.从num开始遍历,如果第num个比赛的开始时间大于等于第m个比赛的结束时间,参加的比赛数目+1;如果第num个比赛的开始时间小于第m个比赛的结束时间,num+1
5.输出最多参加的比赛数目
代码
#include<bits/stdc++.h>
using namespace std;
struct exam{
int x;
int y;
}t[3000005];//创建结构体变量
bool cmp(exam a,exam b)
{
return a.y<b.y;
}//对比函数
int main()
{
int n,a,b,num=2,m=1,sum=1;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a>>b;
t[i].x=a;//开始时间
t[i].y=b;//结束时间
}
sort(t+1,t+n+1,cmp);//sort排序
while(num<=n)
{
if(t[m].y<=t[num].x)
{
m=num;
sum++;
}//第num个比赛的开始时间大于第m个比赛的结束时间
num++;
}
cout<<sum;//输出最多参加的比赛数目
return 0;
}