填空(答案已测试)
试题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)