蓝桥杯A组——Python(10.05)Day7
- 开门见山,直接上题目
W2T2-矩形拼接:
已知3个矩形的大小依次是 a1,b1,a2,b2,a3,b3。用这3个矩形能拼出的所有多边形中边数最少可以是多少?
数理分析之后直接爆破:分析易得最多8条边,
如果存在两个矩形其中有一条边是相等的则为6条,
如果存在三个矩形其中有一条边是相等的则是4条。
如果存在两个矩形某两条边之和为第三个矩形某条边的长度则是6条,
如果这两个矩形的另外一条边是相等的则是4条。
res = 8
a1,b1,a2,b2,a3,b3=map(int,input('请输入三个矩形的长宽:').split(','))
a = [[a1,b1],[a2,b2],[a3,b3]]
for i in range(3):
for j in range(3):
for k in range(3):
if i==j or i==k or j==k:
continue
for i1 in range(2):
for j1 in range(2):
for k1 in range(2):
if a[i][i1]==a[j][j1]+a[k][k1]:
res = min(res,6)
if a[j][1-j1]==a[k][1-k1]:
res = min(res,4)
if a[i][i1]==a[j][j1]:
res = min(res,6)
if a[i][i1]==a[j][j1]==a[k][k1]:
res = min(res,4)
print(res)
简单粗暴,脑子里想一想直接爆破
W2T3-消除游戏:
在一个字符串S中,如果Si=Si-1且Si!=Si+1则称Si和Si+1为边缘字符。如果Si!=Si-1且Si=Si+1则Si-1和Si也称为边缘字符。其它的字符都不是边缘字符。对于一个给定的串 S一次操作可以 #一次性# 删除该串中的所有边缘字符(操作后可能产生新的边缘字符)。
请问经过2的64次方操作后,字符串S变成了怎样的字符串?如果结果为空则输出EMPTY。
本题关键在于一次性删除,如果采用纯列表来删除可能会出现顾前不顾后的情况,所以一次操作包含若干个删除,在一次操作完成前字符串不能改变,所以采用链表来解决问题,改变逻辑空间但不改变实际的字符串。双向链表实现运行速度的优化。
def check(i):
if s[l[i]] == '@' or s[r[i]] == '@':
return
if s[l[i]] == s[i] and s[i] != s[r[i]]:
pos.append(i)
pos.append(r[i])
if s[l[i]] != s[i] and s[i] == s[r[i]]:
pos.append(l[i])
pos.append(i)
#链表删除
def remove(j):
r[l[j]] = r[j]
l[r[j]] = l[j]
st[j] = True #标记当前位置已经被处理过
s='@'+input('请输入字符串:')+'@'
#@作为边界判断
N=len(s)
pos=[]
l,r=[0]*N,[0]*N #双向链表实现一次性删除操作(纯列表删了后数组改变同一次删除都无法删除完全)同时优化时间复杂度
st=[False]*N #哈希表标记是否已处理
n=N-2
#初始化每个位置的左右位置信息
for i in range(1, n + 1):
l[i] = i - 1
r[i] = i + 1
for i in range(1, n + 1):
check(i)
while pos:
pos1 = []
#pos1来作为下一次操作的字符串index表
for p in pos:
if st[p]:
continue #如果位置已经被处理过,则跳过
remove(p)
pos1.append(l[p])
pos1.append(r[p])
pos = []
for e in pos1:
if not st[e]:
check(e)
ans = ""
for i in range(1, n + 1):
if not st[i]:
ans += s[i]
if ans:
print(ans)
else:
print("EMPTY")
这题回顾哈希表和链表的相关操作,看着长,实际逻辑清晰,题目非常ok。
————————————————————————————————————————————————————
状态火热,明天继续
W2(D7)——end