Photo[USACO-2013-USOpen-B]
题目描述
Farmer John想给他的N(2≤N≤1000000000)头奶牛拍照,奶牛们排成一排,编号为1到N。每张照片都能拍摄到队列中连续的部分奶牛,而且FJ希望最终每头奶牛都至少在一张照片中出现过。
遗憾的是,有K(1≤K≤1000)对不友好的奶牛,其中的每对奶牛拒绝出现在同一张照片中。
给出这K对不友好的奶牛,请帮助FJ计算一下,他至少要拍摄多少张照片。
输入格式
第一行,两个整数N和K
接下来K行,每行两个整数A_i和B_i,表示位置分别为A_i和B_i的两头奶牛不友好,拒绝出现在同一张照片中。
输出格式
一行,一个整数,表示为了达成拍摄目标,FJ需要最少拍摄多少张照片
输入输出样列
输入样例1:
7 3
1 3
2 4
5 6
输出样例1:
3
说明
样例说明:
FJ需要拍摄3张照片:
照片1,从1到2
照片2,从3到5
照片3,从6到7
【耗时限制】1000ms 【内存限制】128MB
解题思路:
如果要保证Ai与Bi不在一张照片中,也就是Ai到Bi是不能连续,Ai和Bi之间要有断点。
如果在片段Ai到Bi之间增加一个断点,那么照片的数量就会增加1,要想使得照片的数量尽量的少,所以我们的断点要尽量的少
问题转化为,选择尽量少的点,使得每个区间内至少有一个断点,也就是区间选点问题
1.先按照右端点从小到大排序
2.第一个区间的右端点作为选择的第一个点
3.如果接下来的区间的左端点大于上一个点则需要重新选择点
注意:① 给出的K对Ai Bi没有并保证Ai一定比Bi小,所以在读取数据时要先判断大小并进行处理保证左端点小于右端点,即Ai小于等于Bi
注意: ② N头奶牛至少有一张照片,所以ans要初始化为1,每增加一个断点,照片的数量增加1
AC代码: