贪心算法-区间问题 C++

题目一

解题思路

原题解:https://www.acwing.com/solution/content/79913/![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/711a981f425740b7ad5856e519c08b7a.png)

代码实现

cpp 复制代码
#include<iostream>
#include<algorithm>

using namespace std;

const int N = 1e5 + 10;

struct Range {
    int l, r;
    
    bool operator < (const Range &w) const {
        return r < w.r;
    }
}range[N];

int main()
{
    int n;
    cin >> n;
    
    for (int i = 0; i < n; i ++ )
    {
        scanf("%d%d", &range[i].l, &range[i].r);
    }
    
    sort(range, range + n);
    
    int res = 0, ed = -0x3f3f3f3f;
    for (int i = 0; i < n; i ++ )
    {
        if (ed < range[i].l)
        {
            res ++;
            ed = range[i].r;
        }
    }
    
    cout << res;
    return 0;
}

题目二

解题思路

代码实现

cpp 复制代码
#include<iostream>
#include<algorithm>

using namespace std;

const int N = 1e5 + 10;

struct Range {
    int l, r;
    bool operator < (const Range &w) const {
        return r < w.r;
    }
}range[N];

int main()
{
    int n;
    cin >> n;
    
    for (int i = 0; i < n; i ++ )
    {
        scanf("%d%d", &range[i].l, &range[i].r);
    }
    
    sort(range, range + n);
    int res = 0, ed = -0x3f3f3f3f;
    
    for (int i = 0; i < n; i ++ )
    {
        if (ed < range[i].l)
        {
            ed = range[i].r;
            res ++;
        }
    }
    
    cout << res;
    return 0;
}

题目三

解题思路

原题解:https://www.acwing.com/solution/content/14773/

代码实现

cpp 复制代码
#include<iostream>
#include<algorithm>
#include<queue>

using namespace std;

const int N = 1e5 + 10;

struct Range {
    int l, r;
    bool operator < (const Range &w) const
    {
        return l < w.l;
    }
}range[N];

int main()
{
    int n;
    cin >> n;
    
    for (int i = 0; i < n; i ++ )
    {
        scanf("%d%d", &range[i].l, &range[i].r);
    }
    
    sort(range, range + n);
    priority_queue<int ,vector<int>, greater<int>> heap;
    
    for (int i = 0; i < n; i ++)
    {
        if (heap.empty() || range[i].l <= heap.top())
        {
            heap.push(range[i].r);
        }
        else
        {
            heap.pop();
            heap.push(range[i].r);
        }
    }
    
    cout << heap.size();
    return 0;
}

题目四

解题思路

原题解:https://www.acwing.com/solution/content/16980/

为什么r = -2e9不能放在for循环内:

例如样例:

4 10 2

4 5

11 12

当第一轮st更新后是5,第二轮j 还是 0,不过此时应该退出了,但如果-2e9放在外面,

if (r < st)

{

res = -1;

break;

}

就不会执行

代码实现

cpp 复制代码
#include<iostream>
#include<algorithm>

using namespace std;

const int N = 1e5 + 10;

struct Range {
    int l, r;
    bool operator < (const Range &w) const {
        return l < w.l;
    }
}range[N];

int main()
{
    int st, ed, n;
    cin >> st >> ed >> n;
    
    for (int i = 0; i < n; i ++ )
    {
        scanf("%d%d", &range[i].l, &range[i].r);
    }
    
    sort(range, range + n);
    
    int res = 0;
    bool flag = false;
    for (int i = 0; i < n; i ++)
    {
        int j = i, r = -0x3f3f3f3f;
        while (range[j].l <= st && j < n)
        {
            r = max(r, range[j].r);
            j ++;
        }
        
        if (r < st)
        {
            flag = true;
            break;
        }
        
        res ++;
        st = r;
        
        if (r >= ed)
        {
            break;
        }
        
        i = j - 1;
    }
    
    if (flag || st < ed)
    {
        res = -1;
    }
    
    cout << res;
    return 0;
}
相关推荐
我叫小白菜6 分钟前
【Java_EE】单例模式、阻塞队列、线程池、定时器
java·开发语言
Albert Edison38 分钟前
【最新版】IntelliJ IDEA 2025 创建 SpringBoot 项目
java·spring boot·intellij-idea
超级小忍1 小时前
JVM 中的垃圾回收算法及垃圾回收器详解
java·jvm
weixin_446122461 小时前
JAVA内存区域划分
java·开发语言·redis
勤奋的小王同学~2 小时前
(javaEE初阶)计算机是如何组成的:CPU基本工作流程 CPU介绍 CPU执行指令的流程 寄存器 程序 进程 进程控制块 线程 线程的执行
java·java-ee
TT哇2 小时前
JavaEE==网站开发
java·redis·java-ee
2401_826097622 小时前
JavaEE-Linux环境部署
java·linux·java-ee
QuantumStack2 小时前
【C++ 真题】P1104 生日
开发语言·c++·算法
天若有情6732 小时前
01_软件卓越之道:功能性与需求满足
c++·软件工程·软件
缘来是庄2 小时前
设计模式之访问者模式
java·设计模式·访问者模式