第十一届蓝桥杯大赛软件类决赛 Python大学组

填空(答案已测试)

试题A:美丽的2(5)

在这里插入图片描述

暴力,for一遍就行了

count=0
for i in range(1,2021):
    if "2" in str(i):
        count+=1
print(count)

在这里插入图片描述

试题B:合数个数

在这里插入图片描述

懒得想那么多了,填空题,能过就行,直接暴力

count=0
for i in range(4,2021):
    for j in range(2,i):
        if i%j==0:
            count+=1
            break
print(count)

在这里插入图片描述

试题C:阶乘约数(10

在这里插入图片描述

什么是约数?能够被100!整除的都算是正约数吧,那就是从1-100的子集问题,最小子集1,最大就是100!所以答案应该是算 100!,再去掉100-100!的质数吧,因为没办法被整除…这题应该我理解不对先放着
正约数表示正的约数
约数:又称因数,a除以整数b(b≠0) 除得的商正好是整数而没有余数,就是a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。约数是有限的,一般用最大公约数。所有数都有约数1,和数字本身。
感觉好像是C100+C100 2+C100 3+…+C100 100
好像还是不对–》小蓝

试题D:本质上升序列

在这里插入图片描述

递归吧,感觉有点像求子集,不过在求子集的时候加上条件就行了,数据量好大…
写出来时间太长了,想办法

tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhf
iadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqij
gihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmad
vrnaaahahndsikzssoywakgnffjaihtniptwoulxbaeqkqhfwl
s="tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnffjaihtniptwoulxbaeqkqhfwl
"
li=list(s)
ans=[]
path=[]
def backtracking(num,begin):
    if isOk(path[:]):
        if path not in ans:
            ans.append(path[:])
    else:
        return
    for i in range(begin,len(num)):
        path.append(num[i])
        backtracking(num,i+1)
        path.pop()
def isOk(path):
    if len(path)==1:
        return True
    for i in range(1,len(path)):
        if path[i]<=path[i-1]:#单掉递增那zz这样应该不算吧
            return False
    return True
        
backtracking(s,0)

print(len(ans)-1)#去掉空集

试题E:玩具蛇(15)

在这里插入图片描述

感觉好像走迷宫,深搜吧,但是得走完每一个格

编程

试题F:天干地支(15)

在这里插入图片描述
在这里插入图片描述

暴力

t=["jia","yi","bing","ding","wu","ji","geng","xin","ren","gui"]
d=["zi","chou","yin","mao","chen","si","wu","wei","shen","you","wu","hai"]
n=int(input())
if n >2020:
    print(t[((n-2020)%10+6)%10],end="")
    print(d[(n-2020)%12],end="")
else:
    print(t[(6-(2020-n)%10)%10],end="")
    print(d[(12-(2020-n)%12)%12],end="")
print()

在这里插入图片描述

然后就是只过了64,就又在数组里面对长度求余数过了92,拼音写错了…
看别人题解: 可以将gengzi放在数组的0下标就省去了每次减来减去,也不需要判断》2020,因为下标也可以为负数

t=["geng","xin","ren","gui","jia","yi","bing","ding","wu","ji"]
d=["zi","chou","yin","mao","chen","si","wu","wei","shen","you","xu","hai"]
n=int(input())
m=(n-2020)%10
q=(n-2020)%12
print(t[m]+d[q])

试题G:重复字符串(20)

在这里插入图片描述

已知K,可以知道字符串的长度,如何求最小次数呢?按照第几个来修改剩余的呢?
先暴力试试

k=int(input())
s=input()
if len(s)%k!=0:#排除不能均分k个字符串的情况
    print(-1)
else:
    ans=[]
    lenn=int(len(s)/k)
    li=[s[i:lenn+i] for i in range(0,len(s),lenn)]
    #暴力,按照哪个来修改呢,全部计算一遍
    for i in range(k):
        count=0
        for j in range(k):
            if i == j:continue
            for l in range(lenn):
                if li[i][l]!=li[j][l]:
                    count+=1
        ans.append(count)
    print(min(ans))

在这里插入图片描述

不知道为啥暴力不是超时,而是出错,不过用时也太长了…

试题H:答疑(20)

在这里插入图片描述

题意:在群里发消息的时刻之和最小,不是从第一条消息到最后一条消息的时间最小
最后一个学生一定是收拾最久的,从第一个学生开始按进教室的时间+问问题的时间进行升序排列,
:eg:1,2,3
一定是1,2,3这样排序得到6最小
不对自己思路和题解都对不上
试试按s+a升序排序,过了40
看了一眼题解,按长度排序就过了100

n= int(input())
time=[]
res=0
for i in range(n):
    m,p,q=map(int,input().split())
    res=max(q,res)
    time.append([m+p,q])
time.sort(key=lambda x:(x[0],x[1])
##for i in range(n-1,-1,-1):
##    if time[i][1]==res:
##        li=time.pop(i)
##        time.append(li)
pre=0
cur=0
ans=[]
for i in time:
    cur=i[0]+pre
    ans.append(cur)
    pre=i[0]+i[1]+pre
print(sum(ans))

在这里插入图片描述

n= int(input())
time=[]
res=0
for i in range(n):
    m,p,q=map(int,input().split())
    res=max(q,res)
    time.append([m+p,q])
time.sort(key=lambda x:(x[0]+x[1]))#变成+号就是100
pre=0
cur=0
ans=[]
for i in time:
    cur=i[0]+pre
    ans.append(cur)
    pre=i[0]+i[1]+pre
print(sum(ans))

在这里插入图片描述

试题I:补给(25)

在这里插入图片描述

试题J:蓝跳跳(25)

在这里插入图片描述
在这里插入图片描述

这题居然让我想起爬楼梯的题,所以应该用动态规划?可是那是求最小的步数,这个是求所有状况
试试回溯超时了

k,p,L=map(int,input().split())
can=[(i+1) for i in range(k)]
path=[]
count=[0]
def backtracking(can,count):
    if sum(path)==L:
        count[0]+=1
        return
    if sum(path)>L:
        return
    for i in range(k):
        if i+1>=p and path:
            if path[-1]>=p :
                continue
        path.append(can[i])
        backtracking(can,count)
        path.pop()
 
backtracking(can,count)
print(count[0]%20201114)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值