题解 P1803 【凌乱的yyy / 线段覆盖】

题解 P1803 【凌乱的yyy / 线段覆盖】_第1张图片

这一类题都属于线段覆盖的题,解题思路的核心基本一致:将整体时间看作一条数轴,那么每场比赛就相当于数轴上的一条线段,每场比赛的开始和结束时间都相当于数轴上的两个端点,我们的目的就是在这条数轴上放入尽可能多的线段.在这里就用到了贪心法:将右端点小的线段优先放入,这样就可以放入尽可能多的线断了

代码:

#include 
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> 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=med){
			sum ++; 
			med = t[i].ed;
		}
	} 
	cout << sum;
	return 0;
}

你可能感兴趣的:(算法笔记)