算法(蓝桥杯)贪心算法3——二维数组排序与贪心算法——活动选择

题目描述

学校在最近几天有 n(n≤100)个活动,这些活动都需要使用学校的大礼堂,在同一时间,礼堂只能被一个活动使。由于有些活动时间上有冲突,学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。

现在给出 nn 个活动使用礼堂的起始时间 begini​ 和结束时间 endi​ (beginii​ << endi​),请你帮助办公室人员安排一些活动来使用礼堂,要求安排的活动尽量多。请问最多可以安排多少活动?

请注意,开始时间和结束时间均指的是某个小时的 0 分 0 秒,如:3 5,指的是 3:00~5:00 ,因此3 5和5 9这两个时间段不算冲突的时间段。

输入

第一行一个整数 n (n≤100);

接下来的 nn 行,每行两个整数,第一个 begini​ ,第二个是 endi​ (begini​ << endi​ ≤≤ 32767);

输出

输出最多能安排的活动数;

样例

输入
复制代码
11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13
输出

4

知识点

贪心算法

题解

(一)输入部分

Python复制

复制代码
n=int(input())
a=[]
for i in range(n):
    a.append(list(map(int,input().split())))
  1. n=int(input()):读取用户输入的一个整数n,表示二维数组的行数。

  2. a=[]:初始化一个空列表a,用于存储二维数组。

  3. for i in range(n)::通过一个循环,循环n次,每次读取一行数据。

    • a.append(list(map(int,input().split()))):读取用户输入的一行数据,使用input().split()将输入的字符串按空格分割成多个子字符串,然后通过map(int,...)将这些子字符串转换为整数,最后使用list(...)将转换后的整数构成一个列表,并将其添加到二维数组a中。

(二)排序部分

Python复制

复制代码
a=sorted(a,key=lambda x: x[1])

这行代码使用Python内置的sorted函数对二维数组a进行排序。

  • key=lambda x: x[1]:指定排序的关键字。这里的lambda x: x[1]是一个匿名函数,表示以二维数组中每个子列表的第二个元素(索引为1的元素,即第二列的元素)作为排序的依据。也就是说,二维数组会按照每个子列表的第二个元素的大小进行升序排序。

(三)计数部分

Python复制

复制代码
sum=1
b=a[0][1]
for i in range(n):
    if a[i][1]==0:
        a[i][1]=24
    elif a[i][0]<b:
        continue
    else:
        b=a[i][1]
        sum+=1
print(sum)
  1. sum=1:初始化计数器sum为1,用于记录满足特定条件的元素数量。

  2. b=a[0][1]:将排序后二维数组的第一个子列表的第二个元素赋值给变量b,作为后续比较的基准值。

  3. for i in range(n)::通过一个循环,遍历排序后的二维数组的每一行。

    • if a[i][1]==0::判断当前子列表的第二个元素是否为0。

      • a[i][1]=24:如果为0,则将其修改为24。这可能是因为在特定的业务场景中,0需要被特殊处理,这里将其视为24来进行后续的比较和计数。
    • elif a[i][0]<b::判断当前子列表的第一个元素是否小于变量b的值。

      • continue:如果是,则直接跳过当前循环,继续下一次循环。这说明如果当前元素的第一个值小于基准值b,那么它不满足计数条件,不需要进行计数。
    • else::如果当前子列表的第二个元素不为0,且第一个元素不小于b。

      • b=a[i][1]:更新变量b的值为当前子列表的第二个元素。这是因为当前元素满足计数条件,需要将其第二个值作为新的基准值,用于后续的比较。

      • sum+=1:计数器sum加1,表示找到了一个满足条件的元素。

  4. print(sum):循环结束后,输出最终的计数结果sum。

完整代码

python 复制代码
n=int(input())
a=[]
for i in range(n):
    a.append(list(map(int,input().split())))
a=sorted(a,key=lambda x: x[1])
sum=1
b=a[0][1]
for i in range(n):
    if a[i][1]==0:
        a[i][1]=24
    elif a[i][0]<b:
        continue
    else:
        b=a[i][1]
        sum+=1
print(sum)

总结

这段代码通过读取用户输入的二维数组,按照数组的第二列进行排序,然后根据特定条件(第一个元素不小于前一个满足条件的元素的第二个值,且第二个值不为0,若为0则视为24)对数组中的元素进行计数,最终输出满足条件的元素数量。这种处理方式在一些特定的业务场景中非常实用,例如在处理时间区间、资源分配等问题时,可以根据特定的排序和计数规则来得到所需的结果。

相关推荐
小徐不徐说1 小时前
每日一算:华为-批萨分配问题
数据结构·c++·算法·leetcode·华为·动态规划·后端开发
武子康2 小时前
Java-82 深入浅出 MySQL 内部架构:服务层、存储引擎与文件系统全覆盖
java·开发语言·数据库·学习·mysql·spring·微服务
倒悬于世2 小时前
开源的语音合成大模型-Cosyvoice使用介绍
人工智能·python·语音识别
惜.己3 小时前
pytest中使用skip跳过某个函数
开发语言·python·测试工具·pytest
菜鸟555554 小时前
图论:最小生成树
算法·图论
挽风8214 小时前
Excel file format cannot be determined, you must specify an engine manually.
python
月阳羊4 小时前
【硬件-笔试面试题】硬件/电子工程师,笔试面试题-26,(知识点:硬件电路的调试方法:信号追踪,替换,分段调试)
笔记·嵌入式硬件·面试·职场和发展
2401_872945095 小时前
【补题】Codeforces Round 735 (Div. 2) C. Mikasa
算法
叫我:松哥5 小时前
基于网络爬虫的在线医疗咨询数据爬取与医疗服务分析系统,技术采用django+朴素贝叶斯算法+boostrap+echart可视化
人工智能·爬虫·python·算法·django·数据可视化·朴素贝叶斯
Star在努力5 小时前
14-C语言:第14天笔记
c语言·笔记·算法