蓝桥杯A组——Python(10.05)Day7

蓝桥杯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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值