题解: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
posted @ 2026-02-26 11:52  团爸讲算法  阅读(0)  评论(0)    收藏  举报