贪心:Stall Reservations S(重写)
题目:P2859 [USACO06FEB] Stall Reservations S - 洛谷
题目概述:每头奶牛都有自己的产奶时段(包括边界点),产奶时要单独呆在牛棚里。问至少需要多少牛棚?奶牛产奶时呆在哪个牛棚里?
思路:
怎么找?
找最早结束牛棚的那一个。如果奶牛的产奶时间,小于等于,最早结束牛棚产奶的那一头奶。说明需要新牛棚。
如果有多个牛棚怎么办?
都可以用,但我们这里用最早结束的牛棚。
本节使用到优先级队列,与Cpp专栏《优先级队列》相关联,有语法部分。
重点讲语法部分:
priority_queue<node> heap; 由于没有指定哪个做比较器,默认使用的是less做比较器,所以代码等价于 priority_queue<node, vector<node>, less<node>> heap;
而less内部调用的是 operator< 。如果我们默认调用less,却选择内部调用operator> ,编译器会报错。
比较器的工作:
- 如果返回 true,表示第一个参数比第二个参数“优先级低”,应该排在后面。
- 如果返回 false,表示第一个参数比第二个参数“优先级高”,应该排在前面。
在这里,我们想将奶牛按r从小到大排序,如果大于,则优先级低,排在后面(小顶堆)。可以很好的完成任务。
代码解析:(图例)
主导项是排序和优先队列操作,时间复杂度为 O(n log n)。
我们可以总结得出,如果结构体数组有多个值,我们要把结构体数组排序,按结构体其中一个成员的大小进行比较,则可以考虑使用优先级队列。