个人总结:
这周属于是最坎坷的一周了(为啥我感觉开学后那么不顺利,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))
# 请在此输入您的代码
个人评价:
本周可以算是状态最差的一周了,希望各位在准备算法之余也要多多注意自己的身体,适时调整状态,祝你我三周后能有一个好的状态去比赛,各位加油啊!!!! 有终之美,无生之耻!!!!