蓝桥杯Python组排序算法与函数

news2024/11/19 16:32:09

目录

一、排序算法

二、排序函数

1、Python 的 sort() 函数和 sorted() 函数

2、sort() 例子

3、sorted() 例子

4、部分排序

三、例题

1、统计数字(lanqiaoOJ题号535)

2、错误票据(lanqiaoOJ题号205)

3、奖学金(lanqiaoOJ题号531)

(1)方法1:sort() 排序

(2)方法2:结构体排序,用sorted()函数

4、外卖店优先级(2019年第十届省赛,lanqiaoOJ184)

(1)结构体排序1:sorted() 排序

5、双向排序(2021年省赛,lanqiaoOJ题号1458)

(1)sort() 代码:

(2)sorted() 函数:

6、第几个幸运数字(lanqiaoOJ题号613)

(1)硬算+排序

(2)暴力搜


一、排序算法

基于比较的低效算法:

选择排序、插入排序、冒泡排序。时间复杂度 O(n^2)。

基于比较的高效算法:

归并排序、快速排序、堆排序。时间复杂度 O(nlogn)。

基于数值划分的高效算法:

计数排序、基数排序、桶排序。时间复杂度 O(n)。

上述的算法在蓝桥杯Python组中据说没有什么卵用,因为排序直接调用函数即可。

二、排序函数

1、Python 的 sort() 函数和 sorted() 函数

  • sort 和 sorted() 的区别
  • sort() 是应用在 list 上的方法,而 sorted 可以对所有可迭代的对象进行排序操作。一个关键的区别是:
  • sort 是在原列表上排序,而 sorted() 产生一个新的列表,不改变原列表。

显然,两函数默认都是升序! 

2、sort() 例子

3、sorted() 例子

  • sorted(iterable, key=None, reverse=False)
  • 参数说明:
  • iterable:可迭代对象。
  • key:用来进行比较的元素,只有一个参数,具体的函数的参数取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse:排序规则,reverse = True 降序,reverse = False 升序 (默认)。
  • 返回值:重新排序的列表。 

4、部分排序

  • Python 的 sort() 不能在数组的一部分上做排序,只能对整个数组排序;
  • sorted() 虽可以对一部分排序,但是不能直接在原数组上排序。

三、例题

1、统计数字(lanqiaoOJ题号535)

【题目描述】

某次科研调查时得到了 n 个自然数。已知不相同的数不超过 10000 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。

【输入描述】

第 1 行是整数 n,表示自然数的个数。第 2~n+1 行每行一个自然数。其中,1 <= n <= 2×10^5,每个数均不超过 1.5×10^9。

【输出描述】

输出 m 行 ( m 为 n 个自然数中不相同数的个数 ),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。

【输入样例】

8

2

4

2

4

5

100

2

100

【输出样例】

2 3

4 2

5 1

100 2

先排序,然后对相等的数做统计即可。

n=int(input())
nums={}
for i in range(n):
    x=int(input())
    if x in nums.keys():
        nums[x]+=1
    else:
        nums[x]=1
key=list(nums.keys())
key.sort()
for i in key:
    print(i,nums[i])

下面的代码更简单,但是超时了。

最后一行导致超时,因为计算量太大:for 循环是 O(n) 的,内部统计每个数字的个数的计算量也是 O(n) 的,合起来共 O(n^2)。

n=int(input())
nums=[]
for i in range(n):
    nums.append(int(input()))   # 读n行的数字
key=list(set(nums))             # 去重,再转为 list,因为 list 才能 sort
key.sort()
for i in key:
    print(i,nums.count(i))      # 这里超时

2、错误票据(lanqiaoOJ题号205)

【题目描述】

某涉密单位下发了某种票据,并要在年终全部收回。每张票据有唯一的 ID 号。全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造成了某个 ID 断号,另外一个 ID 重号。你的任务是通过编程,找出断号的 ID 和重号的 ID 。假设断号不可能发生在最大和最小号。

【输入描述】

要求程序首先输入一个整数 N (N<100) 表示后面数据行数。接着读入 N 行数据。每行数据长度不等,是用空格分开的若干个 (不大于100个) 正整数 (不大于105)。

【输出描述】

要求程序输出 1 行,含两个整数 m,n,用空格分隔。其中,m 表示断号 ID,n 表示重号 ID。

【输入样例】

2

5 6 8 11 9

10 12 9

【输出样例】

7 9

读取所有数字,先排序,然后查找丢失的数字和重复的数字。第 10 直接查询数字,第 12 行直接返回数字的数量。

n=int(input())
a=[]
for i in range(n):
    num=input().split()
    for j in range(len(num)):
        a.append(int(num[j]))   # 读取n行数据,存到a[]
a.sort()
for i in range(a[0],a[0]+len(a)):
    if i not in a:
        ans1=i
    if a.count(i)==2:
        ans2=i
print(ans1,ans2)

3、奖学金(lanqiaoOJ题号531)

【题目描述】

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有 3 门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。

任务:先根据输入的 3 门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前 5 名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据 (每行输出两个数:学号、总分)是:

7 279

5 279

这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和),但学号为 7 的学生语文成绩更高一些。如果你的前两名的输出数据是:

5 279

7 279

则按输出错误处理,不能得分。

【输入描述】

第 1 行为一个正整数 n (6 <= n <= 300),表示该校参加评选的学生人数。第 2 到 n+1 行,每行有 3 个用空格隔开的数字,每个数字都在 0 到 100 之间。第 j 行的 3 个数字依次表示学号为 j-1 的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为 1~n (恰好是输入数据的行号减 1)。所给的数据都是正确的,不必检验。

【输出描述】

输出共有 5 行,每行是两个用空格隔开的正整数,依次表示前 5 名学生的学号和总分。

(1)方法1:sort() 排序

count=int(input())
info=[]
for i in range(count):
    info.append([i+1]+list(map(int,input().split())))
for i in info:
    i.append(sum(i)-info.index(i)-1)
index=reversed((4,1,0))
for i in index:
    info.sort(key=lambda x:x[i],reverse=True)
for i in range(0,5):
    print(info[i][0],info[i][4])

(2)方法2:结构体排序,用sorted()函数

import functools
def cmp(n1,n2):
    if n1[1]!=n2[1]:
        return -1 if n1[1]>n2[1] else 1
    elif n1[2]!=n2[2]:
        return -1 if n1[2]>n2[2] else 1
    else:
        return 1 if n1[0]>n2[0] else -1

n=eval(input())
scores=[]
for i in range(n):
    score=list(map(int,input().split()))
    scores.append([i+1,sum(score)]+score)
res=sorted(scores,key=functools.cmp_to_key(cmp))
for j in range(5):
    print(res[j][0],res[j][1],sep=" ")
    

4、外卖店优先级(2019年第十届省赛,lanqiaoOJ184)

【题目描述】

“饱了么” 外卖系统中维护着 N 家外卖店,编号 1~N。每家外卖店都有一个优先级,初始时 (0时刻) 优先级都为 0。每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。如果某家外卖店某时刻优先级大于 5 ,则会被系统加入优先缓存中;如果优先级小于等于 3,则会被清除出优先缓存。给定 T 时刻以内的 M 条订单信息,请你计算 T 时刻时有多少外卖店在优先缓存中。

【输入描述】

第一行包含 3 个整数 N,M,T。以下 M 行每行包含两个整数 ts,id,表示 ts 时刻编号 id 的外卖店收到一个订单。其中,1<=N, M, T<=10^5,1<=ts<=T,1<=id<=N。

【输出描述】

输出一个整数代表答案。

(1)结构体排序1:sorted() 排序

n,m,T=map(int,input().split())
a=[]
priorty=[]
for i in range(m):
    a.append([int(j) for j in input().split()])
a=sorted(a,key=lambda a:a[0])   # 按结构体中的时间排序
order=[0 for i in range(n+1)]
prior=[0 for i in range(n+1)]
flag=[0 for i in range(n+1)]

for i in range(m):
    tt=a[i][0]   #time
    idd=a[i][1]  #id
    if tt!=order[idd]:
        prior[idd] -= tt-order[idd]-1
    if prior[idd]<0:
        prior[idd]=0
    if(prior[idd]<=3):
        flag[idd]=0
    prior[idd]+=2
    if(prior[idd]>5):
        flag[idd]=1
    order[idd]=tt

for i in range(1,n+1):
    if order[i]<T:
        prior[i]-=T-order[i]
        if prior[i]<=3:
            flag[i]=0

ans=0
for i in range(n+1):
    if flag[i]>0:
        ans+=1

print(ans)

5、双向排序(2021年省赛,lanqiaoOJ题号1458)

【题目描述】

给定序列 (a1, a2, ..., an) = (1 , 2, ..., n),即 ai=i。小蓝将对这个序列进行 m 次操作,每次可能是将a1, a2, ..., aqi 降序排列,或者将 aqi, aqi+1, ... , an 升序排列。请求出操作完成后的序列。

【输入描述】

输入的第一行包含两个整数 n,m,分别表示序列的长度和操作次数。接下来 m 行描述对序列的操作,其中第 i 行包含两个整数 pi,qi 表示操作类型和参数。当 pi=0 时,表示将 a1,a2, ..., aqi 降序排列;当 pi=1 时,表示将 aqi, aqi+1, ..., an 升序排列。

【输出描述】

输出一行,包含 n 个整数,相邻的整数之间使用一个空格分隔,表示操作完成后的序列。

【评测用例规模与约定】

对于 30% 的评测用例,n,m <= 1000;对于 60% 的评测用例,n,m<=5000;对于所有评测用例, 1<=n, m<=100000,0<= ai<=1,1<=bi<=n。

【简单解法】

直接按题目要求做排序,一次排序的计算复杂度是 O(nlogn),m 次排序的总复杂度是 O(mnlogn),可以通过 60% 的评测。Python代码,用 sort() 函数或 sorted() 函数排序。不过这两个函数没有 C++ 的 sort() 灵活。sort() 不能在数组的一部分上做排序,只能对整个数组排序,本题只能先拷贝出要排序的部分,排序后再拷贝回去;sorted() 虽可以对一部分排序,但是不能直接在原数组上排序。

(1)sort() 代码:

n,m=map(int,input().split())
a=[i for i in range(1,n+1)]
for i in range(m):
    p,q=map(int,input().split())
    if p==0:
        c=a[:q]
        c.sort(reverse=True)
        a[:q]=c
    else:
        b=a[q-1:n]
        b.sort()
        a[q-1:n]=b
for i in a:
    print(i,end='')

(2)sorted() 函数:

n,m=map(int,input().split())
a=[i for i in range(1,n+1)]
for i in range(m):
    p,q=map(int,input().split())
    if p==0:
        a=sorted(a[:q],reverse=True)+a[q:]  #排序后再拷贝回去
    else:
        a=a[:q-1]+sorted(a[q-1:])
for i in a:
    print(i,end='')

6、第几个幸运数字(lanqiaoOJ题号613)

【题目描述】

一个整数如果只含有因子 3、5、7,称为幸运数字。前 10 个幸运数字是 3、5、7、9、15、21、25、27、35、45。问 59084709587505 是第几个幸运数字。

(1)硬算+排序

由于 Python 编码简洁,即使硬算出所有 3、5、7 的倍数,然后再排序找到 59084709587505 的位置,也容易编码。

n=59084709587505
a=[1]   #放3、5、7的倍数
k=0

while True:
    for i in range(3,8,2):  #i=3、5、7
        tmp=i*a[k]      #产生一个新的倍数
        if tmp not in a:    #去重
            a.append(tmp)   #放进去
            a.sort()
        if tmp>2**64:       #随便取一个远远大于n的数
            print(a.index(n))
            exit(0)
    k+=1

(2)暴力搜

cnt=0
for i in range(50):
    for j in range(50):
        for k in range(50):
            a,b,c=3**i,5**j,7**k
            if a*b*c<=59084709587505:
                cnt+=1
print(cnt-1)    #幸运数字不包括1

以上, 蓝桥杯Python组排序算法与函数

祝好

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/148961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程池 - ThreadPoolExecutor 详解

线程池 - ThreadPoolExecutor 详解 线程池 ThreadPoolExecutor 源码解析参考 juc 专栏系列文章。 基本概述 线程池&#xff1a;一个容纳多个线程的容器&#xff0c;容器中的线程可以重复使用&#xff0c;省去了频繁创建和销毁线程对象的操作。 线程池作用&#xff1a; 降低资…

【基础】Elasticsearch 基础

Elasticsearch 基本概念及使用Elasticsearch 基本概念ES 的简介及使用场景ES 基本概念ES 与 Kibana 的安装Elasticsearch 分词器ES 内置分词器ik 分词器的安装和使用Elasticsearch 基本使用索引操作数据的增删改查DSL 查询聚合查询批量操作Elasticsearch 基本概念 ES 的简介及…

多线程锁相关

日升时奋斗&#xff0c;日落时自省 目录 1、常见的锁策略 1.1、悲观锁vs乐观锁 1.2、轻量级锁vs重量级锁 1.3、自旋锁vs挂起等待锁 1.4、互斥锁vs读写锁 1.5、公平锁vs非公平锁 1.6可重入锁vs不可重入锁 2、CAS 2.1、CAS解析 2.2、CAS的应用场景 2.2.1、实现原子类 …

JavaSE学习day2_03, 算数运算符

5. 算术运算符 5.1 分类&#xff1a; - * / % 5.2 细节&#xff1a; 1.运算规则。跟小学数学是一模一样的 2.如果是整数跟整数进行计算&#xff0c;结果只能是整数。直接去掉小数部分&#xff0c;保留整数。如5/22,而不是2.5. 3.如果想要结果中有小数&#xff0c;需要有小…

(二)K8S Namespace 和 Label

Namespace 1、K8S集群中默认的Namespace为default&#xff0c;通过Namespace可以实现Pod之间的相互隔离&#xff08;如测试环境、生成环境的隔离&#xff09; 2、通过K8S的资源配置机制限定不同的Namespace对CPU、内存的使用&#xff0c;再通过K8S授权机制将不同的Namespace交…

启动ruoyi框架(初学)

启动ruoyi框架&#xff08;初学&#xff09;&#xff08;RuoYi&#xff09; Ruo Yi启动ruoyi框架&#xff08;初学&#xff09;&#xff08;[RuoYi](http://doc.ruoyi.vip/)&#xff09;一、简介二、项目启动1.前端模组&#xff1a;RUOYI-UI2.后端模组&#xff1a;3.环境要求&a…

Java版阿里云/腾讯云域名动态映射DDNS到动态IPv4或IPv6

1 介绍 利用业余时间&#xff0c;整合了一下阿里云和腾讯云动态域名映射&#xff0c;并将其使用spring boot做了一下封装&#xff0c;正好可以把家里的闲置电脑和IP v6利用起来&#xff0c;具体使用方法如下&#xff0c;或者参考对应项目的readme文档 2 地址 aliyun-ddns&am…

数据分析-深度学习 Day3

youtube课程地址&#xff1a;&#xff08;实时更新&#xff09;https://www.youtube.com/playlist?listPLJV_el3uVTsMhtt7_Y6sgTHGHp1Vb2P2Jwww.youtube.com/playlist?listPLJV_el3uVTsMhtt7_Y6sgTHGHp1Vb2P2JB站课程地址&#xff1a;李宏毅2021机器学习【week3】&#xff1a…

基于tensorflow框架bert的自然灾害描述文本分类详细教程

概述: 使用tensorflow框架: 预测给定的推文是否与真正的灾难有关。如果是这样,预测一个1。如果不是,预测一个0 数据展示:

Java之String概述、对象创建原理和常见面试题、String类常用API、案例

目录String、ArrayList前言String简单介绍Arraylist简单介绍String 概述String类的特点详解总结String类创建对象的两种方式两种方式有什么区别吗&#xff1f;总结String常见面试题String类常用API-字符串内容比较总结String类常用API-遍历、替换、截取、分割操作String案例验证…

内存管理(C/C++)

内存管理&#xff08;C/C&#xff09;C/C内存分布C语言中的动态内存管理方式C中动态内存管理new / delete 操作内置类型new 和 delete 操作自定义类型operator new 和 operator delete 函数operator new 和 operator delete 函数new 和 delete 的实现原理内置类型自定义类型定位…

【人工智能原理自学】激活函数:给机器注入灵魂

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;笔记来自B站UP主Ele实验室的《小白也能听懂的人工智能原理》。 &#x1f514;本文讲解激活函数&#xff1a;给机器注入灵魂&#xff0c;一起卷起来叭&#xff01; 目录一、“分…

已解决pandas正确创建DataFrame对象的四种方法(通过list列表、dict字典、ndarray、Series对象创建)

已解决&#xff08;pandas创建DataFrame对象失败&#xff09;ValueError: 4 columns passed, passed data had 2 columns 文章目录报错代码报错翻译报错原因解决方法创建DataFrame对象的四种方法1. list列表构建DataFrame2. dict字典构建DataFrame3. ndarray创建DataFrame4. Se…

【MySQL】十一,存储引擎

查看存储引擎 查看mysql提供什么存储引擎 设置系统默认的存储引擎 查看默认的存储引擎 show variables like %storage_engine%; SELECT default_storage_engine;修改默认的存储引擎 如果在创建表的语句中没有显式指定表的存储引擎的话&#xff0c;那就会默认使用 InnoDB 作…

08、ThingsBoard使用msa构建镜像并上传到Harbor

1、概述 今天讲解如何使用thingsboard源码中的msa模块来构建镜像,首先我先说一下这个模块的作用,很多人都不明白msa是如何构建镜像的,msa下面创建了很多模块,每个模块都是一个应用,就像我们平时微服务一样可以独自启动,thingsboard是使用这些模块去其它模块拉取代码过来…

卷积神经网络 Convolutional Neural Network (CNN)

CNNObservation 1Observation 2Benefit of Convolutional LayerMultiple Convolutional LayersComparision of Two StoriesObservation 3Convolutional Layers PoolingApplication: Playing GoTo learn more ...仅供个人学习&#xff0c;不具参考价值&#xff01; Image Class…

python代码运行速度有点慢 ? 教你使用多线程速度飞升

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 在我们爬取数据的时候,有时候它运行速度会非常慢 那么怎么解决呢? 这里给大家带来一个多线程的方法 我们用采集二手车来举例 环境使用: Python 3.8 Pycharm 模块使用: requests 数据请求模…

JVM类加载机制-让你明明白白的了解类的执行流程

一、类加载运行过程1.1 类加载到jvm的流程当我们使用java命令运行某个类的main函数启动程序时&#xff0c;首先需要通过类加载器把主类加载到jvm里。1.2 loadClass的类加载过程其中loadClass的类加载过程有如下几步&#xff1a;加载 >> 验证 >> 准备 >> 解析…

关于Visual Studio C++项目属性设置的说明

链接器—常规—输出文件 这里的输出文件指的是最终生成的exe文件 C/C–常规—附加包含目录 这里指的是需要include的一些头文件所在的 目录&#xff0c;可以提前在项目文件中建立好include文件&#xff0c;然后在这里设置&#xff0c;以后将一些自定义的include头文件放在这个…

Python之父强烈推荐,爬虫入门经典《python3网络爬虫开发实战》

实操性很强的一本工具书&#xff0c;由浅入深&#xff0c;深入浅出。前面从环境配置到爬虫原理、基本库和解析库的使用再到数据存储&#xff0c;一步步把基础打好&#xff0c;然后再分门别类介绍了Ajax、动态页、验证码、App的爬取、识别等&#xff0c;还讲解了代理使用、模拟登…