前言
本系列是我学习完大佬的方法后,为了蓝桥杯前几天可以快速过一遍所做,所以部分内容会很简洁。如果能够帮助到你,我也会很开心!!!
思路
遇到贪心
想想哪一种方案是最优解。
需不需要排序
区间选点
题目
数轴上有n个闭区间,取尽量少的点,使得每一个区间都至少有一个点
思路
1.优先选择那些终点较早的区间(右端点从小到大排序)
2.逐一分析每一段区间是否包含点,如果不包含,则需要增加个数,继续观察
sort(arr,arr+n);//排序
int ans = 0;
int end = -1e9;
for (int i = 0; i < n; ++i) {
// 如果区间的左端点大于当前整个的右端点
if (arr[i].start > end) {
ans++; // 个数加1
end = arr[i].end; // 更新区间的右端点
}
一句话概述:
排序完成看左端点,间隔在区间加
区间覆盖
题目
数轴上有n个闭区间,取尽量少的区间覆盖指定线段的全部区域
思路
1.把各个区间按照左端点从小到大排序
2.选择同左端点的最长区间,这样可以尽可能的覆盖,同时start要记得更新
代码部分(待更新)
一句话概述:
排序完成看长区间右端点
定义区间结构体代码
// 定义区间结构体
struct Part {
int start;
int end;
bool operator<(const Part& H) const {
return end < H.end;
}
}part[N];
其他
看中间值会不会是最小值
看从大到小排序或者从小到大排序会不会是最优解
看是不是最好的加最坏的