算法(蓝桥杯)贪心算法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)对数组中的元素进行计数,最终输出满足条件的元素数量。这种处理方式在一些特定的业务场景中非常实用,例如在处理时间区间、资源分配等问题时,可以根据特定的排序和计数规则来得到所需的结果。

相关推荐
蹦蹦跳跳真可爱5891 小时前
Python----计算机视觉处理(Opencv:道路检测之提取车道线)
python·opencv·计算机视觉
Tanecious.3 小时前
机器视觉--python基础语法
开发语言·python
想跑步的小弱鸡3 小时前
Leetcode hot 100(day 3)
算法·leetcode·职场和发展
ALe要立志成为web糕手3 小时前
SESSION_UPLOAD_PROGRESS 的利用
python·web安全·网络安全·ctf
Tttian6225 小时前
Python办公自动化(3)对Excel的操作
开发语言·python·excel
xyliiiiiL5 小时前
ZGC初步了解
java·jvm·算法
爱的叹息5 小时前
RedisTemplate 的 6 个可配置序列化器属性对比
算法·哈希算法
蹦蹦跳跳真可爱5895 小时前
Python----机器学习(KNN:使用数学方法实现KNN)
人工智能·python·机器学习
独好紫罗兰6 小时前
洛谷题单2-P5713 【深基3.例5】洛谷团队系统-python-流程图重构
开发语言·python·算法
zhuyixiangyyds7 小时前
day21和day22学习Pandas库
笔记·学习·pandas