贪心算法-区间问题 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;
}
相关推荐
雨中飘荡的记忆16 分钟前
深入理解设计模式之单例模式
java·设计模式
程序员西西24 分钟前
Spring Boot整合MyBatis调用存储过程?
java·后端
2501_9418798134 分钟前
Python在微服务高并发异步API网关请求处理与智能路由架构中的实践
java·开发语言
AAA简单玩转程序设计37 分钟前
Java进阶小白手册:基础玩法升级,告别青铜套路
java
whltaoin38 分钟前
【 手撕Java源码专栏 】Spirng篇之手撕SpringBean:(包含Bean扫描、注册、实例化、获取)
java·后端·spring·bean生命周期·手撕源码
闻缺陷则喜何志丹38 分钟前
【SOSDP模板 容斥原理 逆向思考】3757. 有效子序列的数量|分数未知
c++·算法·力扣·容斥原理·sosdp·逆向思考
BestOrNothing_20151 小时前
一篇搞懂 C++ 重载:函数重载 + 运算符重载,从入门到会用(含 ++、<<、== 实战)
c++·函数重载·运算符重载·operator·前置后置++·重载与重写
用户3721574261351 小时前
使用 Java 删除 Word 文档中的水印
java
艾斯比的日常1 小时前
Java 三色标记算法:并发垃圾回收的核心技术解析
java·开发语言·算法
2501_941144421 小时前
Python + C++ 异构微服务设计与优化
c++·python·微服务