蓝桥杯 第十二届 Python组真题

本文介绍了作者在算法实战中遇到的挑战,包括卡片问题、线段排序、最小路径和、欧几里得算法、图论问题以及时间格式转换等。作者发现自己在动态规划和搜索算法上的理解有待提高,决定接下来集中精力提升这方面的能力。文章通过实例展示了动态规划的运用,如Dijkstra算法求最短路径,并探讨了DFS和BFS在解决复杂问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.卡片

2.40257

3.

4.10266837

5.

6.时间显示

7.杨辉三角 

8. 

9.

10.


做了三个小时,和去年相比,也就能多做一个dijkstra

其他的地方看着根本没思路,看了看答案也都是动归,dfs,bfs,但是以我目前的理解,好像用不到这上面

这次就当体验一下题目了,接下来的两个月重点抓动归和搜索

1.卡片

答案为3181

hash=[0 for i in range(10)]
i=1
while(i):
    string=str(i)
    for j in string:
        hash[int(j)]+=1
        if hash[int(j)]==2021:
            print(i)
            i=0
            break
    if i==0:
        break
    else:i+=1

2.40257

python小数运算会搞怪 

def getline(a,b):
    if b[0]-a[0]==0:
        k=-1<<31
        b=b[0]
    else:
        k=(b[1]-a[1])/(b[0]-a[0])
        b=b[1]-k*b[0]
    return (k,b)
point=[]
for i in range(20):
    for j in range(21):
        point.append((i,j))
ans=[]
for i in range(len(point)):
    for j in range(i+1,len(point)):
        line=getline(point[i],point[j])
        if line not in ans:
            ans.append(line)
print(len(ans))

3.

4.10266837

def gcd(a,b):
    if b==0:
        return a
    return gcd(b,a%b)
def getmin(a,b):
    return a*b//gcd(a,b)
adj=[[]for i in range(2022)]
for i in range(1,2022):
    left,right=-1,-1
    if i<21:
        left=1
        right=i+21
    elif i>2000:
        left=i-21
        right=2021
    else:
        left=i-21
        right=i+21
    for j in range(left,right+1):
        length=getmin(i,j)
        adj[i].append((j,length))
d=[1<<31 for i in range(2022)]
vis=[False for i in range(2022)]
def dijkstra():
    d[1]=0
    for i in range(2021):
        minlength=1<<31
        minindex=-1
        for j in range(1,2022):
            if not vis[j] and d[j]<minlength:
                minlength=d[j]
                minindex=j
        if minindex==-1:
            return
        vis[minindex]=True
        for point in adj[minindex]:
            index=point[0]
            length=point[1]
            if not vis[index] and d[index]>d[minindex]+length:
                d[index]=d[minindex]+length
dijkstra()
print(d[2021])

5.

def gcd(a,b):
    if b==0:
        return a
    return gcd(b,a%b)
adj=[[]for i in range(22)]
for i in range(1,22):
    for j in range(i+1,22):
        if gcd(i,j)==1:
            adj[i].append(j)
            adj[j].append(i)

vis=[False for i in range(22)]
ans=0
length=0
def dfs(cur):
    global vis
    global ans
    global length
    if 1 in adj[cur] and False not in vis:
        ans+=1
        return
    if False not in vis:
        return
    for i in adj[cur]:
        if not vis[i]:
            vis[i]=True
            dfs(i)
            vis[i]=False
    return
# for i in adj:
#     print(i)
vis[0]=True
vis[1]=True
dfs(1)
print(ans)

6.时间显示

a=int(input())
day=24*60*60
s=a//1000
s=s%day
h=s//3600
lst=s%3600
m=lst//60
s=lst%60
print("{:02d}:{:02d}:{:02d}".format(h,m,s))

7.杨辉三角 

a=int(input())
dp=[[0 for i in range(a)]for i in range(a)]
dp[0][0]=1
cur=1
def finds():
    for i in range(1,a):
        dp[i][0]=1
        dp[i][i]=1
        for j in range(1,i):
            dp[i][j]=dp[i-1][j-1]+dp[i-1][j]
            if dp[i][j]==a:
                cur=(i*(i+1))//2+1+j
                return cur
print(finds())

8. 

9.

10.

### 第十二届蓝桥杯 Python A 真题 以下是第十二届蓝桥杯 Python A的部分真题及其背景描述: #### 题目A:带宽 此题考察的是字符串处理能力以及简单的逻辑运算。题目要求计算给定数据流中的最大带宽数值[^1]。 #### 题目B:纯质数 该问题涉及基础的数学概念——质数判断。具体来说,需要找出满足特定条件的一类特殊质数,并统计其总数。 #### 题目C:完全日期 本题主要测试考生对于日期时间的理解和操作技能。任务是验证某个年份是否存在所谓的“完全日期”,即某月某日正好等于当年天数总和的情况。 #### 题目D:最小权值 这是一个典型的图论最短路径算法应用实例。通过构建加权无向图模型来解决实际生活场景下的优化选择难题。 #### 题目E:大写 针对字符转换的基础练习题型之一,重点在于掌握大小写字母之间的ASCII码关系并实现相应功能函数。 #### 题目F:123 属于合排列方面的思考挑战,需考虑如何有效枚举所有可能情况而不重复遗漏任何一种可能性。 #### 题目G:冰山 涉及到三维空间几何图形体积估算方法的研究探讨,在编程过程中还需要注意边界条件设定等问题。 #### 题目H:和与乘积 围绕两个整数数展开分析讨论,目标是在一定约束条件下求得最佳匹配方案使得最终结果达到最优状态。 #### 题目I:二进制问题 深入探究计算机底层表示形式原理的应用实践案例,特别强调位运算技巧的重要性及其高效解决问题的能力展现。 #### 题目J:翻转括号序列 最后一大难点则聚焦于栈结构特性发挥极致效用之上,旨在检验学生能否灵活运用先进先出原则完成复杂嵌套层次管理作业。 ```python # 示例代码片段展示部分解法思路 def is_prime(n): """ 判断n是否为素数 """ if n <= 1: return False for i in range(2, int(n ** 0.5) + 1): if n % i == 0: return False return True num = 0 for i in range(1, 10000): num += str(i).count("1") if 2021 == num: print(f"The answer to the first question is {i}.") # 输出答案 break ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值