题解:AcWing 905 区间选点
【题目来源】
AcWing:905. 区间选点 - AcWing题库
【题目描述】
给定 \(N\) 个闭区间 \([a_i,b_i]\),请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。
输出选择的点的最小数量。
位于区间端点上的点也算作区间内。
【输入】
第一行包含整数 \(N\),表示区间数。
接下来 \(N\) 行,每行包含两个整数 \(a_i,b_i\),表示一个区间的两个端点。
【输出】
输出一个整数,表示所需的点的最小数量。
【输入样例】
3
-1 1
2 4
3 5
【输出样例】
2
【算法标签】
《AcWing 905 区间选点》 #贪心#
【代码详解】
#include <bits/stdc++.h> // 包含所有标准库头文件
using namespace std;
const int N = 100005; // 定义常量N,表示区间的最大数量
int n; // 定义变量n,表示实际输入的区间数量
// 定义一个结构体Range,表示一个区间
struct Range
{
int l, r; // l表示区间的左端点,r表示区间的右端点
// 重载小于运算符,用于排序
// 按照区间的右端点r从小到大排序
bool operator < (const Range &W) const
{
return r < W.r;
}
}range[N]; // 定义一个Range类型的数组range,用于存储所有区间
int main()
{
cin >> n; // 输入区间的数量n
// 循环读入每个区间的左右端点
for (int i = 0; i < n; i++)
{
int l, r;
cin >> l >> r; // 输入第i个区间的左端点l和右端点r
range[i] = {l, r}; // 将输入的区间存储到range数组中
}
// 对range数组进行排序,按照区间的右端点从小到大排序
sort(range, range + n);
int res = 0; // 定义变量res,用于记录最终选择的区间数量
int ed = -2e9; // 定义变量ed,表示当前已选择区间的最大右端点,初始化为一个极小值
// 遍历排序后的区间数组
for (int i = 0; i < n; i++)
{
// 如果当前区间的左端点大于ed,说明当前区间与已选择的区间不重叠
if (range[i].l > ed)
{
res++; // 选择当前区间,res加1
ed = range[i].r; // 更新ed为当前区间的右端点
}
}
cout << res << endl; // 输出最终选择的区间数量
return 0; // 程序正常结束
}
【运行结果】
3
-1 1
2 4
3 5
2
浙公网安备 33010602011771号