POJ 2376 Cleaning Shifts
原题
农夫约翰指派他的N (1 <= N <= 25,000)头牛在谷仓周围做一些清洁杂务。他总是希望有一头牛来打扫卫生,他把一天分成了T班(1 <= T <= 1,000,000),第一个班是1班,最后一个班是T班。
每头牛只能在一天的某些时段进行清洁工作。任何被选来做清洁工作的牛都会在整个休息期间一直工作。
你的工作是帮助农民约翰分配一些奶牛轮班,这样(i)每个轮班至少有一头奶牛被分配,(ii)尽可能少的奶牛参与清洁。如果无法为每个班次分配一个cow,打印-1。
输入:
第1行:两个空格分隔的整数:N和T
第2行…N+1:每一行包含奶牛可以工作的时间间隔的开始和结束时间。牛在开始的时间开始工作,在结束的时间结束。
输出*第1行:农场主John需要雇佣的奶牛的最小数量,如果不可能在每个班次分配一头奶牛,则为-1。
Sample Input
3 10
1 7
3 6
6 10
Sample Output
2
提示此问题输入数据量大,使用scanf()代替cin来读取数据,避免超过时间限制。
输入详细信息:有3头奶牛和10个班次。牛1号可以倒班。奶牛2号可以倒班奶牛3号可以倒班 输出详细信息:通过选择奶牛1号和3号,覆盖了所有的轮班。用不到2头牛是无法覆盖所有轮班的。
题解
题意:有一个长度为T的线段,现在给你N个小的线段,要求使用最少的小线段覆盖整个大线段。
思路:典型的区间贪心问题,遍历线段上的每一个点,确保该点被覆盖,每次都选取右端点最远的线段,并且跳到该线段右端点的下一个点。
#include