【错题集-编程题】活动安排(贪心 - 区间)

简介: 【错题集-编程题】活动安排(贪心 - 区间)

牛客对应题目链接:活动安排_牛客题霸_牛客网 (nowcoder.com)


一、分析题目

区间问题的贪心:排序,然后分情况讨论,看看是合并还是求交集。


二、代码

1、没看题解之前AC的代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
typedef pair<int, int> PII;
vector<PII> q;
 
bool cmp(PII x, PII y)
{
    return x.second<y.second;
}
 
int main()
{
    int n;
    cin >> n;
    while(n--)
    {
        int a, b;
        cin >> a >> b;
        q.push_back({a, b});
    }
    sort(q.begin(), q.end(), cmp);
    int cnt=1;
    int ed=q[0].second;
    for(int i=1; i<q.size(); i++)
    {
        if(ed<=q[i].first)
        {
            cnt++;
            ed=q[i].second;
        }
    }
    cout << cnt << endl;
    return 0;
}

2、值得学习的代码

//写法一
#include <iostream>
#include <algorithm>
using namespace std;
 
typedef pair<int, int> PII;
 
const int N = 2e5 + 10;
 
int n;
PII arr[N];
 
int main()
{
    cin >> n;
    for(int i = 0; i < n; i++) cin >> arr[i].first >> arr[i].second;
    sort(arr, arr + n);
 
    int ret = 0, r = arr[0].second;
    for(int i = 1; i < n; i++)
    {
        if(arr[i].first < r) // 有重叠
        {
            r = min(r, arr[i].second);
        } 
        else // 没有重叠
        {
            ret++;
            r = arr[i].second;
        }
    }
    cout << ret + 1 << endl;
 
    return 0;
}
 
//写法二
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
const int N=2e5+10;
 
struct activity
{
    int a;
    int b;
    static bool cmp(const activity& v1, const activity& v2)
    {
        return v1.b<v2.b;
    }
}ac[N];
 
int main()
{
    int n;
    cin >> n;
    for(int i=0; i<n; i++)
        cin >> ac[i].a >> ac[i].b;
    sort(ac, ac+n, activity::cmp);
    int cnt=1;
    int ed=ac[0].b;
    for(int i=1; i<n; i++)
    {
        if(ed<=ac[i].a)
        {
            cnt++;
            ed=ac[i].b;
        }
    }
    cout << cnt << endl;
    return 0;
}

三、反思与改进

对手写 cmp 排序还不够熟悉,需要多尝试不同写法并牢记。


相关文章
|
6月前
【错题集-编程题】买卖股票的最好时机(一)(贪心 + 动态规划)
【错题集-编程题】买卖股票的最好时机(一)(贪心 + 动态规划)
|
6月前
|
C语言
青蛙跳台阶:我如何得知它是一道斐波那契数列题?——应用题破题“三板斧”(一)
这篇内容介绍了C语言学习中的经典例题——斐波那契数列,强调了解题思路的重要性。斐波那契数列是一个数列,其中每个数是前两个数的和。文章指出,很多类似题目,如“青蛙跳台阶”,实质上都在考察斐波那契数列的实现。文中提供了斐波那契数列的定义、代码实现和递归与非递归的思路,并鼓励读者从问题中分析出解题模型,而非直接套用已知方法。此外,还提及了一道相关题目“矩形覆盖问题”,以供进一步练习。
48 0
|
6月前
|
机器学习/深度学习 算法 测试技术
青蛙跳台阶:我如何得知它是一道斐波那契数列题?——应用题破题“三板斧”(二)
这篇内容是关于解题策略的,主要介绍了在面对应用题时可以采用的“三板斧”方法:举例、模拟和找规律。通过一个走楼梯的例子详细解释了这三个步骤如何运用。首先,举例将抽象问题具体化,比如走5级台阶有几种方式。其次,通过模拟不同情况,例如思考走每一步的可能,发现递归或循环的模式。最后,通过找规律归纳出一般性的解决方案,这里发现走台阶问题与斐波那契数列相关。文章还提到了一个拓展案例——矩形覆盖问题,同样可以用类似的方法分析。总的来说,文章强调了解题过程中理解和转化问题的重要性,以及通过训练提升这方面能力。
53 0
|
6月前
|
存储
【错题集-编程题】组队竞赛(排序 + 贪心)
【错题集-编程题】组队竞赛(排序 + 贪心)
|
6月前
|
调度 容器
【错题集-编程题】主持人调度(二)(贪心 + 优先级队列)
【错题集-编程题】主持人调度(二)(贪心 + 优先级队列)
|
6月前
|
存储 算法 Java
【算法设计与分析】— —实现活动安排问题的贪心算法。
【算法设计与分析】— —实现活动安排问题的贪心算法。
|
6月前
蓝桥备战--纪念品分组OJ532,贪心证明
蓝桥备战--纪念品分组OJ532,贪心证明
28 0
|
算法
秒懂算法 | 活动安排问题贪心算法
通过例子分析求解活动安排问题的最好贪心策略、展示按照贪心策略求解该问题的过程。
472 0
秒懂算法 | 活动安排问题贪心算法
【短学期算法作业】八皇后问题(回溯法)
【短学期算法作业】八皇后问题(回溯法)
【短学期算法作业】八皇后问题(回溯法)
|
机器学习/深度学习 机器人 API
【蓝桥杯省赛】冲刺练习题【经典题目练习】倒计时【01】天(准考证组委会已下发,请查询)-1
【蓝桥杯省赛】冲刺练习题【经典题目练习】倒计时【01】天(准考证组委会已下发,请查询)
115 0
【蓝桥杯省赛】冲刺练习题【经典题目练习】倒计时【01】天(准考证组委会已下发,请查询)-1