蓝桥杯Python b组 个人复习笔记(week3)(病)

作者分享了自己在蓝桥杯双周赛中的经历,强调了比赛中更多是思维题而非算法题,提到了自定义排序中的cmp_to_key方法以及遇到的其他思维和编程挑战。同时提醒参赛者注意保持身心健康,平衡算法训练和思维能力提升。
摘要由CSDN通过智能技术生成

个人总结:

这周属于是最坎坷的一周了(为啥我感觉开学后那么不顺利,orz),这周周三周四的时候直接大病了两天,周五一天课,周六又报名了蓝桥杯的双周赛(orz),属于是四面楚歌了,只有周一周二两天,根本不够我这个小白把搜索类算法练熟的,所以搜索类算法的总结顺势延后(喵的别再出意外了,再出意外我干脆别比了,找个老歪脖子树算了orz)。所以本周主要来看看这次的蓝桥双周赛(小白)的题目除开最后一题没来的及做之外,其它的题目都有琢磨过了,希望大家多多交流,大佬看见鄙人的思路轻喷(孩子病刚好利索QAQ)

练手总结:

(赛题链接)https://www.lanqiao.cn/oj-contest/newbie-8/

本次小白双周赛不同以往,更多的是思维题而非算法题,除开我还没看的最后一题,我所碰到的只有二进制王国勉强用到了算法的相关知识(如果说字符串的相关操作能算的上的话),而且本次的结果也是比较人意料的,除开整体通过率偏低之外(不知道是不是因为这次都是纯小白,我之前来的时候见到过1小时不到直接AK的。orz),我本人在做的时候比起编码难度,更多的感到的是思维压力;可见我们在练习算法之余,也不能落下最基本的思维能力,从这周后,除开专项的算法训练,我也会为自己多多添加思维题与数论题的练习

坤星球【算法赛】

第一题直接算数print(输出即可)我们直接来看编程题

二进制王国【算法赛】

这题截止到目前为止通过率也才只有20.3% 但实际并不难,我们需要明白的是字符串排序时如何真正的使字典序达到最小

我们通常考虑的是直接使用sort() 策略直接贪心使字典序达到最小,但这里会存在反例,如下所示:

['b','ba'] , b<ba 所以此时拼接出的结果便会是bba, 但实际上的最小的结果却应是bab。

清楚了这一点我们才能够正确的做出此题

下面附代码:

from functools import *
# 读取输入
n = int(input())
def duibi(x, y):
    if x+y < y+x:
        return -1
    elif x+y > y+x:
        return 1
    else: # 两者相等
        return 0
li = []
for i in range(n):
    li.append(input())

# 对数据进行排序
li.sort(key = cmp_to_key(duibi))

# 输出结果
print(''.join(li))
# 请在此输入您的代码

# 请在此输入您的代码

这里我们在排序自定义的时候,引入了一个新方法cmp_to_key() 它的主要作用在于将一个比较函数(接受两个参数并返回一个负数、零或正数)转化为一个key函数来进行自定义应用。

3. djwcb【算法赛】(铲车人集合)

这题很简单,没有什么深究的知识点,找到规律即可,这里的规律就是每4次幂就是一个来回,我们只需要判断p的后两位即可(小心是0的情况):

代码如下:

import os
import sys
t = int(input())

for _ in range(t):
    x, p = input().split()
    x = int(x) % 10
    p = int(p[-2:]) % 4
    if p == 0: p = 4
    print(pow(x, p, 10))
# 请在此输入您的代码

插一句题外话,上面的代码并不是我比赛时的代码,下面的代码才是我比赛时通过的代码:

import os
import sys
# 读取输入
n = int(input())
li = []

for _ in range(n):
    x, p = map(int, input().split())
    li1 = 1 if p == 0 else pow(x % 10, p % 4 + 4, 10)
    li.append(li1)

# 输出结果
print(*li, sep='\n')
# 请在此输入您的代码

然而,如果你直接在复制在蓝桥的Python的环境下运行这段代码的话会显示错误,但是我当时并没有发现因为我赛时用的编译器是PyPy3

这意外也给了我启发,虽然蓝桥杯不让我们用PyPy3,但是未来的比赛里我们未必用不上,如果我们未来遇到了思路正确,写法正确,优化想不出来一头雾水,背水一战的时候,切换PyPy3或许能够解决这个问题(但是还是能别用就别用,毕竟有罚时,orz)

求解线性方程组【算法赛】

这道题赛时因为规律发现的少了,导致没能AC

关键的规律有以下三条:

1.x3 = a2- a1

2. xn = an-1 - xn-1 - xn-2

3. 注意 a1 与 x1 x2 之间的映射关系

弄清楚这三条,本题便迎刃而解了!

代码如下:

import os
import sys
def solve():
    if a[1] == 2:
        x[1] = x[2] = 1
    if a[1] == 0:
        x[1] = x[2] = 0
    if a[1] == 1:
        x[1] = 0
        x[2] = 1
    if n <= 2:
        return
    else:
        x[3] = a[2] - a[1]
        recur()
        for i in range(1, n + 1):
            # 注意这个判断条件,其实是当01不符合情况的时候,x4必小于零
            if (x[i - 1] + x[i] + x[i + 1]) != a[i] or x[i] < 0:
                x[1] = 1
                x[2] = 0
                recur()
                break

def recur():
    for i in range(4, n + 1):
        x[i] = a[i - 1] - x[i - 1] - x[i - 2]

n = int(input())
a = [0] + list(map(int, input().split()))
x = [0] * (n + 2)
solve()
print(' '.join(map(str, x[1:n + 1])))
# 请在此输入您的代码

美丽圆环【算法赛】

我最懊悔的一道题,如果正常发挥,静下心来此题一定能AC的,本题思路也比较简单,各位萌新用心体会即可

PS.此题代码直接后来发现题解上有大佬写的比我的更好,所以这里就不用我的代码了,但是思路上都是一样的。

import os
import sys
# 必须排序,排序后除开首尾两个数之外中间的其它部分都符合了条件
T = int(input())

def solve(N,A):
  if N==2:# 特殊情况
    if A[0]==A[1]:
      return 0
    else:
      return 1
    
  A.sort();
  if A[0]==A[1] and A[-1]==A[-2]:
    return 0
  if (A[0]!=A[1] and A[-1]==A[-2]) or (A[0]==A[1] and A[-1]!=A[-2]):
    return 1
  if A[0]!=A[1] and A[-1]!=A[-2]:
    if A[1]==A[2] or A[-2]==A[-3]:
      return 1
    else:
      return 2

for i in range(0,T):
  N = int(input())
  A = list(map(int,input().split()))
  print(solve(N,A))
# 请在此输入您的代码

个人评价:

本周可以算是状态最差的一周了,希望各位在准备算法之余也要多多注意自己的身体,适时调整状态,祝你我三周后能有一个好的状态去比赛,各位加油啊!!!! 有终之美,无生之耻!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值