这一类题都属于线段覆盖的题,解题思路的核心基本一致:将整体时间看作一条数轴,那么每场比赛就相当于数轴上的一条线段,每场比赛的开始和结束时间都相当于数轴上的两个端点,我们的目的就是在这条数轴上放入尽可能多的线段.在这里就用到了贪心法:将右端点小的线段优先放入,这样就可以放入尽可能多的线断了
代码:
#include <bits/stdc++.h>
using namespace std;
typedef struct test{
int st;
int ed;
}test;
int cmp(test t1,test t2){
if(t1.ed == t2.ed ) return t1.st < t2.st;
return t1.ed < t2.ed;
}
int n,sum,med;//med用来记录上一场比赛的结束时间
test t[1000000];
int main(int argc, char** argv) {
cin >> n;
for(int i=0;i<n;i++){
cin >> t[i].st >> t[i].ed;
}
//将数组按结束时间从小到大的顺序排序
sort(t,t+n,cmp);
//结束时间最早的那场比赛一定是可以参加的
med = t[0].ed;
//因为已经参加了第一场的比赛,所以初始sum应为1
sum = 1;
//这里要注意,因为已经参加一场比赛了,所以i要从1开始
for(int i=1;i<n;i++){
//如果这场比赛的开始时间大于等于上场比赛的结束时间,则可以参加
if(t[i].st>=med){
sum ++;
med = t[i].ed;
}
}
cout << sum;
return 0;
}