csp信奥赛C++高频考点专项训练之贪心算法 --【区间贪心】:线段覆盖

csp信奥赛C++高频考点专项训练之贪心算法 --【区间贪心】:线段覆盖

题目描述

现在各大 oj 上有 n n n 个比赛,每个比赛的开始、结束的时间点是知道的。

yyy 认为,参加越多的比赛,noip 就能考的越好(假的)。

所以,他想知道他最多能参加几个比赛。

由于 yyy 是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加 2 2 2 个及以上的比赛。

输入格式

第一行是一个整数 n n n,接下来 n n n 行每行是 2 2 2 个整数 a i , b i ( a i < b i ) a_{i},b_{i}\ (a_{i}<b_{i}) ai,bi (ai<bi),表示比赛开始、结束的时间。

输出格式

一个整数最多参加的比赛数目。

输入输出样例 1
输入 1
复制代码
3
0 2
2 4
1 3
输出 1
复制代码
2
说明/提示
  • 对于 20 % 20\% 20% 的数据, n ≤ 10 n \le 10 n≤10;
  • 对于 50 % 50\% 50% 的数据, n ≤ 10 3 n \le 10^3 n≤103;
  • 对于 70 % 70\% 70% 的数据, n ≤ 10 5 n \le 10^{5} n≤105;
  • 对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 10 6 1\le n \le 10^{6} 1≤n≤106, 0 ≤ a i < b i ≤ 10 6 0 \le a_{i} < b_{i} \le 10^6 0≤ai<bi≤106。

AC代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;  

const int N = 1e6 + 10;  // 定义最大数据范围

// 定义活动结构体,s为开始时间,e为结束时间
struct node {
    int s, e;
} a[N];

// 自定义排序规则,按结束时间升序排列
bool cmp(node x, node y) {
    return x.e < y.e;
}

int main() {  
    int n;
    cin >> n;
    // 读入所有活动的开始和结束时间
    for(int i = 1; i <= n; i++) {
        cin >> a[i].s >> a[i].e;
    }
    
    // 按结束时间升序排序,便于贪心选择
    sort(a + 1, a + n + 1, cmp);
    
    int ans = 1;       // 至少可以参加第一个活动
    int now = 1;       // 当前最后参加的活动是第一个
    
    // 从第二个活动开始遍历
    for(int i = 2; i <= n; i++) {
        // 如果当前活动的开始时间 >= 已选活动的结束时间,则选择该活动
        if(a[i].s >= a[now].e) {
            ans++;
            now = i;  // 更新最后参加的活动为当前活动
        }
    }
    
    cout << ans;
    return 0;  
}

功能分析

该程序解决了活动选择问题,目标是找出不重叠的最大活动数量。采用贪心算法策略:

  1. 排序阶段:将所有活动按结束时间升序排序。这样每次可以优先选择结束时间最早的活动,为后续活动留出更多时间。

  2. 选择阶段:初始化选择第一个活动(排序后最早结束的),然后遍历剩余活动。若当前活动的开始时间不早于已选活动的结束时间,则选择该活动,并更新已选活动的指针。通过这种策略,保证每一步选择都是局部最优,最终得到全局最优解。

该算法的时间复杂度主要由排序决定,为O(n log n),适用于题目中的最大数据规模。

各种学习资料,助力大家一站式学习和提升!!!

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"##########  一站式掌握信奥赛知识!  ##########";
	cout<<"#############  冲刺信奥赛拿奖!  #############";
	cout<<"######  课程购买后永久学习,不受限制!   ######";
	return 0;
}

【秘籍汇总】(完整csp信奥赛C++学习资料):

1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):

https://edu.csdn.net/lecturer/7901 点击跳转

2、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

https://edu.csdn.net/course/detail/41081 点击跳转

3、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转

4、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新): https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转

5、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转

· 文末祝福 ·

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"跟着王老师一起学习信奥赛C++";
	cout<<"    成就更好的自己!       ";
	cout<<"  csp信奥赛一等奖属于你!   ";
	return 0;
}
相关推荐
小小de风呀2 分钟前
de风——【从零开始学C++】(十二):stack和queue的基本使用和模拟实现
开发语言·c++
huohaiyu13 分钟前
深入解析Java垃圾回收机制
java·开发语言·算法·gc
汉克老师13 分钟前
GESP6级C++考试语法知识(五十三、动态规划----背包问题(六、分组背包)
c++·动态规划·背包问题·gesp6级·gesp六级·分组背
浮芷.20 分钟前
鸿蒙PC端 TTS 并发调用问题详解:资源竞争与队列管理
算法·华为·开源·harmonyos·鸿蒙·鸿蒙系统
装不满的克莱因瓶29 分钟前
掌握感知器的学习原理
人工智能·python·神经网络·算法·ai·卷积神经网络
Lsk_Smion29 分钟前
力扣实训 _ [994].腐烂的橘子/图论
算法·leetcode·图论
轻微的风格艾丝凡37 分钟前
两电平三相VSC整流模式从不控整流平滑切换至有源整流调试记录
算法·dsp·c2000
雪度娃娃39 分钟前
转向现代C++——保证const成员函数的线程安全性
开发语言·c++
坚果派·白晓明1 小时前
[鸿蒙PC三方库移植适配] 使用 AtomCode + Skills 自动完成Protobuf鸿蒙化适配
c语言·c++·华为·harmonyos
dongf20191 小时前
R语言KNN算法
算法·数据分析·r语言