POJ 2376 Cleaning Shifts(贪心)
Description
有一段从1到n的区间,现有多条线段(左右界不同,有重合区域),求最少需几条线段才能覆盖整个大区间?
Analyze
我知道选择一个区间要尽可能选右界大的,于是我按右界排序,后来发现做不了……这题应该明确:在左界能承接上一个区间的前提下选右界最大的。我一直难以做到左右兼顾,按左界排序?按右界排序?先左后右?先右后左?没有合适的排序方式。后来发现贪心有它的前提和选择。
贪心前提:左界承接前段
贪心选择:右界选择最右
我们得先满足前提,后贪心选择。
那就按左界从小到大排序,保证左边的是满足前提的,while去遍历
遍历过程中用
right = max(right, a[pos].r)
来贪心选择最右的更新右界,再从上次停止的位置起重复上述过程
Attention:
上次停止的位置(设为pos)是满足条件的最右的位置,更新后的右界(设为right)是遍历过程中最右的界线,right >= a[pos].r >= a[pos].l,所以这个方法只需要遍历一遍,O(n)
Code
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49