第四章作业
include
include
include
using namespace std;
int main() {
int n;
cin >> n;
vector<pair<int, int>> intervals(n);
for (int i = 0; i < n; ++i) {
cin >> intervals[i].first >> intervals[i].second;
}
sort(intervals.begin(), intervals.end(), [](const pair<int, int>& a, const pair<int, int>& b) {
return a.second < b.second;
});
int count = 0;
int last = -1;
for (const auto& interval : intervals) {
if (interval.first > last) {
count++;
last = interval.second;
}
}
cout << count << endl;
return 0;
}
采用的是右端点优先的贪心策略,首先将所有闭区间 [ai, bi] 按照右端点 bi 从小到大进行排序,然后比较右端点和下一个闭区间左端点,如果之间存在覆盖的情况就选择第一个区间的右端点作为局部最优选择,没有覆盖就加一个点,选择当前区间的右端点 bi 作为新点再去比较。
时间复杂度由 “输入”、“排序”、“遍历” 三个部分组成:
输入数据:读取 n 个区间,时间复杂度为 O(n)。
排序操作:使用sort 函数平均 / 最坏时间复杂度为 O(n log n))。
遍历选点:只需一次遍历所有 n 个区间,进行简单的条件判断和变量更新,时间复杂度为 O(n)。
最后的时间复杂度为O(n log n)
贪心算法就是通过求每一个小部分(局部)的最优解,然后逐渐扩大到整体,得到全局最优解。

浙公网安备 33010602011771号