蓝桥杯2022Python组

news2024/11/16 21:59:29

蓝桥杯2022Python组

1.排列字母

在这里插入图片描述

用一个sorted就好了,没啥好说的

s = 'WHERETHEREISAWILLTHEREISAWAY'
s = sorted(s) # 变成列表形式了
print(''.join(s))

2.寻找整数

在这里插入图片描述

这题我刚开始以为答案只能是11和17的倍数,就在他们的倍数里面找,发现不对,他还有可能是50以上的质数的倍数。但是他肯定是11和17的倍数是没跑的,就是187的倍数,肯定不可能是187的偶数倍,因为mod2余1,所以我们从187开始搜,跨度为187*2,但是那样也很多,我们给他加一点条件看看能不能找到什么规律。

我是加了最多五个,作为条件,找到了规律他们是一个等差数列,因此我们就可以拿那个等差数列去寻找我们最终想要的

# a = 0
# res = []
# for i in range(187,10**17,374): # 不能被我除尽,一定不是187的偶数倍
#     if i % 49 == 46 and i % 48 == 41 and i % 47 == 5 and i % 46 == 15 and i % 45 == 29:
#         a = a+1
#         res.append(i)
#         if a == 5:break
# print(res)


mod = [(2, 1), (3, 2), (4, 1), (5, 4), (6, 5), (7, 4), (8, 1), (9, 2), (10, 9),
       (11, 0), (12, 5), (13, 10), (14, 11), (15, 14), (16, 9), (17, 0), (18, 11), (19, 18),
       (20, 9), (21, 11), (22, 11), (23, 15), (24, 17), (25, 9), (26, 23), (27, 20), (28, 25), (29, 16),
       (30, 29), (31, 27), (32, 25), (33, 11), (34, 17), (35, 4), (36, 29), (37, 22), (38, 37), (39, 23),
       (40, 9), (41, 1), (42, 11), (43, 11), (44, 33), (45, 29), (46, 15), (47, 5), (48, 41),(49,46)
       ]
for i in range(5458460249,10**17,12590206409 - 5458460249):
    for a,b in mod:
        if i % a != b:break
    else:print(i)

3.纸张尺寸

在这里插入图片描述

这题又变得简单了,一题难一题简单的,简单的枚举一下就好了

a = 1189 
b = 841
res = []
for i in range(10):
    res.append([a,b])
    if a > b: a = a//2
    else: b = b // 2
n = input()
if n == 'A0': 
    print(res[0][0])
    print(res[0][1])
if n == 'A1': 
    print(res[1][1])
    print(res[1][0])
if n == 'A2': 
    print(res[2][0])
    print(res[2][1])
if n == 'A3': 
    print(res[3][1])
    print(res[3][0])
if n == 'A4': 
    print(res[4][0])
    print(res[4][1])
if n == 'A5': 
    print(res[5][1])
    print(res[5][0])
if n == 'A6': 
    print(res[6][0])
    print(res[6][1])
if n == 'A7': 
    print(res[7][1])
    print(res[7][0])
if n == 'A8': 
    print(res[8][0])
    print(res[8][1])
if n == 'A9': 
    print(res[9][1])
    print(res[9][0])

4.位数排序

在这里插入图片描述

最开始的想法就是创建一个字典,每个数都对应这他自己的位数和,然后让位数和去排序,是可行的

n,m = int(input()),int(input())

dic = {}
for i in range(1,n+1):
    dic.update({i:sum([int(x) for x in str(i)])})
res = sorted(dic.items(),key = lambda x:x[1])
print(res[m-1][0])

PS 因为他本身已经因为自己的数排序了,就是1,2,3,4所以位数和排完后不需要再去对他们自己进行排个序

5.蜂巢

在这里插入图片描述

能把坐标系画出来也不难了这题,很简单,你想想,比如往东偏北60°走两格,是不是y+2,x+1?那我们就这样想,往东偏北60*走一格是y+1,x+0.5 ,这样类似的就行了。然后我们坐标系就建好了。

建好之后找他们两的位置就不难,我们可以画图发现,如果abs(y1-y2) > abs(x1-x2),那我们的最短距离就是abs(y1-y2).可以画个图尝试一下,需要的话我可以再补。

如果abs(y1-y2) < abs(x1-x2)呢,我们还是先走y轴的部分,走完呢y轴斜着走肯定x也会变,走到一个点和另一个点平行,然后再走X轴直线就好了(当然画图会形象,有条件的可以去画画)

def find(x,y,n,step):
    if n == 0:
        x -= step
        return x,y
    if n == 1:
        x -= 0.5*step
        y += step
        return x,y
    if n == 2:
        x += 0.5*step
        y += step
        return x,y
    if n == 3:
        x += step
        return x,y
    if n == 4:
        x += 0.5*step
        y -= step
        return x,y
    if n == 5:
        x -= 0.5*step
        y -= step
        return x,y

if __name__ == '__main__':
    d1,p1,q1,d2,p2,q2 = map(int,input().split())
    xb1,yb1 = find(0,0,d1,p1)
    xb,yb = find(xb1,yb1,(d1+2)%6,q1)
    xc1,yc1 = find(0,0,d2,p2)
    xc,yc = find(xc1,yc1,(d2+2)%6,q2)

    if abs(yc - yb) >= abs(xc - xb): print(abs(yc-yb))
    else: print(int(abs(yc - yb) + (abs(xc - xb) - 0.5*abs(yc - yb))))

6.消除游戏

在这里插入图片描述

很简单,我们遍历一遍,把边缘字符的坐标给加入到一个集合里,然后删除就好了。

def eliminate(s): 
    a = set()
    for i in range(1,len(s)-1):
        if s[i-1] == s[i] and s[i] != s[i + 1]:
            a.add(i+1)
            a.add(i)
        if s[i] == s[i + 1] and s[i] != s[i - 1]:
            a.add(i)
            a.add(i-1)
    s = list(s)
    for i in a:
        s[i] = ''  # 边缘的都变成’‘
    return ''.join(s)
    
if __name__ == '__main__':
    s = input()
    for _ in range(2**64):
        temp = s
        s = eliminate(s)
        if temp == s:
            print(s) 
            break
        if len(s) == 0:
            print('EMPTY')
            break

7.全排列的价值

在这里插入图片描述

这个如果写多重循环肯定会TLE的哦,我们可以发现一个递推公式

参考与https://blog.csdn.net/BlacKingZ/article/details/124066488

当然大佬最后有一块递推的部分直接略过了,我这边补充一下,就是一层一层往下推就好了,记住P1 = 0 P2 = 1

在这里插入图片描述

8.技能升级

在这里插入图片描述

我感觉他这个题简单一会难一会的,这题也蛮简单的。。我还在想有没有什么坑呢,应该是没有,就直接遍历每次取最大就好了

if __name__ == '__main__':
    n,m = map(int,input().split())
    A = []
    B = []
    for i in range(n):
        a,b = map(int,input().split())
        A.append(a)
        B.append(b)
    res = 0
    for _ in range(m):  # O(mn)
        maxa = max(A)
        res += maxa
        index1 = A.index(maxa)
        A[index1] -= B[index1]
    print(res)

PS : 也可以不用max和index ,用sorted 直接排序,但要知道sorted 在python 中的时间复杂度是O(nlogn),max和index都是O(n) ,所以我这样总复杂度是O(mn),你用sorted的话时间复杂度是O(mnlogn),会多个logn

9.最长不下降子序列

在这里插入图片描述

这题我一直没有一个很好的解法,最开始超级暴力就是一个个变,变完后去搜他这个序列的最长不下降子序列,发现时间复杂度达到了O(n^3logn),先给你们看看暴力的,应该最多只能多前30%

import copy

时间复杂度O(n^3logn) 太大了,能过1000就不错了

def isfdj(lst):
    return lst == sorted(lst)

if __name__ == '__main__':
    n,k = map(int,input().split())
    ls = [int(x) for x in input().split()]
    l = []
    for i in range(0,n-k):  #O(n)
        if i == 0:
            tmp = copy.deepcopy(ls)
            for j in range(k):     #O(k)
                tmp[j] = 0
        else:
            tmp = copy.deepcopy(ls)
            t = ls[i-1]
            for j in range(i,i+k):
                tmp[j] = t
        ll = 0
        low = 0
        high = 0
        while high < n:     #O(n)
            if isfdj(ls[low,high]): # O(nlogn)
                ll += 1
            else:
                l.append(ll)
                ll = 0
                low = high
            high += 1
        l.append(ll)
    print(len(l))

就是每个地方都根据k变,然后遍历变完之后的序列。不对。。。这个是最长连续不下降序列。。我搞错了,那我们直接看另一种吧,时间复杂度被我降到了O(O^2logn)虽然还是很大,但我能力就到这了

import copy

时间复杂度O(n^3logn) 太大了,能过1000就不错了

def isfdj(lst):
    return lst == sorted(lst)
def erfen(a,k):  # 找到单调递增序列a中 第一个比k大的元素
    l = 0
    r = n
    while l < r:
        mid = (l+r)//2
        if a[mid] > k:r = mid
        else : l = mid
        if r - l == 1:return r
    return 0

if __name__ == '__main__':
    n,k = map(int,input().split())
    ls = [int(x) for x in input().split()]
    l = []
    for i in range(0,n-k):  #O(n)
        if i == 0:
            tmp = copy.deepcopy(ls)
            for j in range(k):     #O(k)
                tmp[j] = 0
        else:
            tmp = copy.deepcopy(ls)
            t = ls[i-1]
            for j in range(i,i+k):
                tmp[j] = t

        res = []
        d =[0]*(n+1)
        d[1] = tmp[0]
        len = 1
        for i in range(1,n):
            if tmp[i] >= d[len]:
                len += 1
                d[len] = tmp[i]
            else: #换掉该换的
                j = erfen(d,tmp[i])
                d[j] = tmp[i]
        res.append(len)
    print(max(res))

最开始每个地方都根据K去变,就是把后面K个数变成最前面的一个数的前一个数的值,然后去找这个字符串的最长不下降子序列,用到了二分查找。

把最长不下降子序列放到一个d里面,d[len]表示这个子序列最大的一个数,如果后一个数大于d[len],那么len++,d[len] = 后一个数

如果后一个数小于d[len]呢?那我们就把他放到他该放的位置上去,并不是直接扔掉,他后面可能会有用的,可以代替d[len]使得最长不下降子序列的最大元素更小。那么我们现在就是要找到一个他的位置,是什么位置呢?在d中找到一个数,这个数是最先>他的,也就是在这个数之前的数都小于等于他,那么他把这个大于他的数给替换到,可以用到二分查找。总复杂度是O(nlogn)

10.最优清零方案

在这里插入图片描述

这题在我看来还是蛮简单的,我也不知道会不会TLE啊,我在蓝桥杯官网找不到这题没办法去测试。就是能消除连续K个肯定是消除连续K个对吧,那我们就从头开始遍历,把K个数当做一个滑动窗口,如果这个滑动窗口中有0,我们就往下滑一格(可以优化直接滑到什么位置,我这里没有做),没有0,我们就把这K个数全部减1,然后直到到最后。 剩下的只能一个个减去1了,就求个sum

if __name__ == '__main__':
    n,k = map(int,input().split())
    A = [int(x) for x in input().split()]

    res = 0
    for i in range(0, n - k+1):
        while 0 not in A[i:i+k]:
            for j in range(i,i+k):
                A[j] -= 1
            res += 1
    res += sum(A)
    print(res)

欢迎大家一起讨论,感觉我还是蛮多不会的

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

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

相关文章

STL——STL简介、STL六大组件

一、STL是什么 STL(standard template library)&#xff1a; C标准模板库&#xff0c;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;还是一个包罗数据结构与算法的软件框架。 通俗来讲&#xff1a; STL就是将常见的数据结构&#xff08;顺序表、…

Superset权限管理

文章目录1.Superset角色1&#xff09;Admin2&#xff09;Alpha3&#xff09;Gamma4&#xff09;Sql_lab5&#xff09;Public2.实操自定义授权1&#xff09;权限集2&#xff09;实操1.Superset角色 Superset的默认角色有&#xff1a;Admin、Alpha、Gamma、sql_lab、Public 1&a…

【信息资源建设】

考试分为单选、判断改错、名词解释、简答、综合论述 1.1 如果按价值观念划分&#xff0c;则可将信息分为有用信息和无用信息 信息的特性&#xff1a;普遍性、客观性、时效性、传递性、共享性、变换性、转化性、可伪性。 1.1.2 &#xff08;必考&#xff09;OECD的知识分类…

【docker概念和实践 4】(4) 本地镜像提交到本地仓库

一、说明 registry是一个镜像&#xff0c;该镜像专门生成镜像仓库的容器&#xff0c;registry是基于http协议&#xff0c;那就是说&#xff0c;在单机、局域网、或者互联网上都可以建立registry数据仓库&#xff0c;存放自己构建的镜像。本篇专门介绍如何在本地单机上建立容器仓…

Python中的集合(set and frozenset)语法汇总

集合的基本语法知识目前有两种集合类型&#xff1a;set和frozenset。可变集合&#xff1a;set()set类型是可变的&#xff0c; 其内容可以使用 add() 和 remove() 这样的方法来改变&#xff0c;因为是可变的&#xff0c;所以没有哈希值&#xff0c;且不能被用作字典的键或其它集…

java线上项目排查,Arthas简单上手

Arthas 是Alibaba开源的Java诊断工具。参考&#xff1a;Arthas 用户文档 — Arthas 3.5.4 文档 当你遇到以下类似问题而束手无策时&#xff0c;Arthas可以帮助你解决&#xff1a; 这个类从哪个 jar 包加载的&#xff1f;为什么会报各种类相关的 Exception&#xff1f;我改的代…

一起Talk Android吧(第四百七十九回:集合类视图动画)

文章目录使用方法属性介绍示例代码各位看官们大家好&#xff0c;上一回中咱们说的例子是"旋转类视图动画",这一回中咱们说的例子是"集合类视图动画"。闲话休提&#xff0c;言归正转&#xff0c;让我们一起Talk Android吧&#xff01; 使用方法 集合类动画…

web测试2:嵌入式移植boa

读此篇之前&#xff0c;先读前一篇 1.在源码编译的时候&#xff0c;指定交叉编译工具链 lkmaoubuntu:~$ arm-linux-gnueabi-gcc --version arm-linux-gnueabi-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 Copyright (C) 2015 Free Software Foundation, Inc.…

C++工程的CMakeLists.txt文件编写

最简单的demo工程如下&#xff1a; #include <iostream> #include <string> int main(int argc,char** argv) {std::cout << "hello world" << std::endl;return 0; } 文件结构如下&#xff0c;其中include可用来自定义接口功能类。 CMake…

IMX Linux 用户手册 --- 1

IMX Linux 用户手册 — 1 第一章 概述 本文档介绍了i.MX LinuxOS BSP (BSP代表Board Support Package)在i.MX平台上的构建和安装方法。它还涵盖了特殊的i.MX功能和如何使用它们。 本文档还提供了运行i.MX平台的步骤&#xff0c;包括单板拨码开关设置、U-Boot引导加载程序的配置…

IP地址是什么

我们知道&#xff0c;网络通讯的本质就是收发数据包。如果说收发数据包就跟收发快递一样。那IP地址就类似于快递上填的收件地址和发件地址一样&#xff0c;有了它&#xff0c;路由器就可以开始充当快递员的角色&#xff0c;在这个纷繁复杂的网络世界里找到该由谁来接收这个数据…

linux上git三板斧的使用

前言 现在在我们的生活当中&#xff0c;用我们程序员的一句玩笑话&#xff0c;来说就是“全球最大的同性交友网站就是githup”。 那么它具有什们功能呢&#xff0c;能让人这么吹捧&#xff0c;用通俗易懂的话来说就是&#xff0c;储存和管理代码&#xff0c;它会记录我们修改甚…

java知识总结(一)

ArrayList和LinkedList的区别1. ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。2. 对于随机访问ArrayList要优于LinkedList,ArrayList可以根据下标以O(1)时间复杂度对元素进行随机访问,而LinkedList的每一个元素都依靠地址指针和它后一个元素连接在一起,查找某个…

【开发工具 - 安装手册】BeyondCompare4 下载与安装+免费使用

1. 官网 Download Beyond Compare Free Trial 2. 下载 阿里云盘 &#xff08;不限速 - 推荐&#xff09;官网下载3. 安装&#xff08;无脑下一步&#xff09; 4.三种方法长期免费使用 方法一 修改初始化文件 C:\Users\Administrator\AppData\Roaming\BCompare\BCompare.ini…

【奇妙的数据结构世界】用图像和代码对队列的使用进行透彻学习 | C++

第十一章 队列 目录 第十一章 队列 ●前言 ●一、队列是什么&#xff1f; 1.简要介绍 2.具体情况 ●二、队列操作的关键代码段 1.类型定义 2.顺序队列的常用操作 3.链式队列的常用操作 ●总结 前言 简单来说&#xff0c;数据结构是一种辅助程序设计并且进行优化的方法论&…

介绍一款2023年新出的mysql管理工具: FlyBird Database Manager

FlyBird Database Manager 介绍 FlyBird Database Manager 是一款mysql 界面化管理工具&#xff0c; 使用go语言编写&#xff0c;天然支持Windows, MacOS, Linux等主流平台。 提供无需安装的命令行版本&#xff0c; 命令行中启动服务&#xff0c;以html支持UI界面,在浏览器中…

[Linux]进程控制

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【LINUX】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文…

1607_PC汇编语言_汇编语言简介

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 刚刚看了一个小章节&#xff0c;感觉是对8086的汇编做了一个简单的介绍。当然&#xff0c;这里面也有各种机器汇编通用的属性。 1. 等价符号关联的两个表达其实是等…

在线教育-谷粒学院学习笔记(十)

文章目录1 介绍2 登录业务流程3 JWT令牌4 阿里云短信服务5 登录功能6 注册功能7 根据token获取用户信息8 整合首页登录和注册1 介绍 登录实现流程 注册接口 整合JWT整合阿里云短信服务 登录接口 注册、登录的前端实现 2 登录业务流程 单一服务器模式 使用session对象实现 …

仿牛客论坛项目(下)

代码仓库:https://gitee.com/qiuyusy/community 仿牛客论坛项目15.kafka1.阻塞队列2.Kafka入门简介术语解释下载配置命令3.Spring整合Kafka引入依赖配置代码16.系统通知(Kafka)发送系统通知功能(点赞关注评论)1.编写Kafka消息队列事件Event实体类2.编写Kafka生产者3.编写Kafka消…