蓝桥python真题

2020

回文日期

在这里插入图片描述


a=['01','02','03','04','05','06','07','08','09','10','11','12']
#注意这里都要写01.02等
b=['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25',
   '26','27','28','29','30','31']
s=[]
def run(i):
    if int(i)%400==0 or int(i)%4==0 and (int(i)%100)!=0:
        return True
    else:
        return False
small=['04','06','09','11']
big=['01','03','05','07','08','10','12']
for i in range(1000,9999):
    if str(i)[::-1][:2] in a and str(i)[::-1][2:] in b:
        s.append(str(i)+str(i)[::-1])
for i in s:#i 是string
    if i[4:6]=='02':
        if run(i) and int(i[6:])>29:
            s.remove(i)
        if run(i)==False and int(i[6:])>28:
            s.remove(i)
    if i[4:6] in small and int(i[6:])>30:
        s.remove(i)
    if i[4:6] in big and int(i[6:])>31:
        s.remove(i)
n=int(input())
for i in s:
    if int(i)>n:
        print(i)
        break
for i in s:
    if int(i)>n and int(i[0:2])==int(i[2:4]) :
        print(i)
        break

1注意[:]是从头到尾输出字符串,[::1]最后一位是排序,1正-1倒

子串分值和

在这里插入图片描述
在这里插入图片描述
自己写的,通过遍历查找,30分,超时了

s=input()
ans=0
def count(str):
    f=0
    str=list(str)
    arr=[[0 for i in range(len(str))] for j in range(len(str))]
    for i in range(len(str)):
        for j in range(len(str)):
            if str[i]==str[j] :
                arr[i][j]=1
    for i in range(len(str)):
        sum=0
        for j in range(len(str)):
            sum+=arr[i][j]
        if sum==1:
            f+=1
    return f

for i in range(len(s)):
    for j in range(i+1,len(s)+1):
        ans+=count(s[i:j])
print(ans)

网上的解题思路:https://blog.csdn.net/weixin_45494989/article/details/123213139
在这里插入图片描述
代码(运行正确):

s=input()
c='a'
ans=0
while ord(c)<=ord('z'):
    if c in s:
        li=[]
        li.append(-1)
        for i in range(len(s)):
            if s[i]==c:
                li.append(i)
        li.append(len(s))
        for i in range(2,len(li)):
            ans+=(li[i]-li[i-1])*(li[i-1]-li[i-2])
    c=chr(ord(c)+1)
print(ans)

荒岛探测(几何)

在这里插入图片描述
在这里插入图片描述
题目比较难,没有思路,骗分(20分):
在这里插入图片描述

###是一道几何题目,看起来没啥思路,可以骗分
xa,ya,xb,yb,L=map(int,input().split())
x1,y1,x2,y2,x3,y3=map(int,input().split())
pi=3.1415926
def dis(xa,xb,ya,yb):
    return ((xa-xb)**2+(ya-yb)**2)**0.5
def areatu(xa,xb,ya,yb):
    a=L*1.0/2
    c=((xa-xb)**2+(ya-yb)**2)**0.5/2
    b=(a*a-c*c)**0.5
    return pi*a*b

def areasan(x1,x2,x3,y1,y2,y3):
    aa=dis(x1,x2,y1,y2)
    bb=dis(x1,x3,y1,y3)
    cc=dis(x2,x3,y2,y3)
    p=(aa+bb+cc)/2
    return (p*(p-aa)*(p-bb)*(p-cc))**0.5

if L<0:      #① -1000<L<1000
    print(0.00)
elif dis(xa,xb,ya,yb)>=L:  #② 发射器和接收器的距离已经超过L
    print(0.00)
elif dis(xa,x1,ya,y1)+dis(xb,x1,yb,y1)<=L and dis(xa,x2,ya,y2)+dis(xb,x2,yb,y2)<=L and dis(xa,x3,ya,y3)+dis(xb,x3,yb,y3)<=L:
    #③三角形在椭圆里面
    print('%.2f'%areasan(x1,x2,x3,y1,y2,y3))
else:
#④椭圆在三角形里面
    print('%.2f'%areatu(xa,xb,ya,yb))

1注意输出的格式,这里要保留两位小数

第十届

修改数组(并查集)

在这里插入图片描述
遍历修改,超时,30分

n=int(input())
s=list(map(int,input().split()))
i=1
while i < len(s):
    j=0
    while j < i:
        if  s[i]!=s[j]:
            j+=1
        else:
            s[i]+=1
            j=0
    i+=1
for i in range(len(s)):
    print(s[i],end=' ')

网上别人的思路,利用并查集:
使用并查集的算法,先寻找A[i]的根节点root,将root加入到答案中,再让father[root]这个集合的值加一,这一步的意义是如果再次遇到之前遇到的数可以直接在最终的答案里写入 这个数根节点的值+1,即我们所求的值。这样循环往复,输入值之后就可以在最终的答案里加入正确的值。

n=int(input())
A=list(map(int,input().split()))
father=[i for i in range(1000000)] #range(n+1)只有80分
def find(x):    #找x的祖先节点
    if x!=father[x]:  
    #如果x的祖先节点不是自己,则是祖先的祖先,直接找到最终的祖先:1->2->3->4
        father[x]=find(father[x])
    return father[x]
for i in range(n):
    root=find(A[i])
    A[i]=root
    father[root]=root+1
for i in range(n):
    print(A[i],end=' ')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值