用处
在对问题求解时,总是做出在当前看来是最好的选择。
有贪心算法的地方基本都有排序。
经典问题
硕鼠
解:结构体数组排序。
田忌赛马
解:将田忌和大王的🐎都由好到劣排序,每次比较一匹🐎,假如田忌的🐎好于大王的🐎,那么就使用这一匹🐎;否则就使用最差的🐎。
事件序列问题
解:每次都找不冲突的、最早结束的。
原因:(反证法证明:至少存在一个时间序列,他包含最早结束的事件)最长时间序列一定包含最早结束的事件。
搬桌子
解:使用标记数组记录每一小段路程的占用次数,然后取这个数组中的最大数。
删数问题
基本思想:保证高位的数尽量小。
解:从左到右每次比较左右两个数,假如左边的数大于右边的数,那么就把左边的数删掉(做标记),这样就可以使得改动之后的数小于原来的数。(每删掉一次就再循环一趟,假如没的删了就删最后一位)
🐸邻居画图问题
基本思想:可图性判断
概念:度序列:若把图G所有顶点的度数排成一个序列S,则称S为图G的度序列。
可图:一个非负整数组成的有限序列如果是某个无向图的度序列,则称该序列是可图的。
Havel-Hakimi定理:
解:按照Havel-Hakimi定理,假如某一步在数组的末尾出现了负数,那么就不可图;假如最后只剩0,则可图。
sort()函数
sort(数组指针, 数组指针+数组大小, 可选参数);
默认从小到大的排序;使用greater<int>()可以实现从大到小的排序。