填空:暴力
A空间
暴力:3181
num = [2021 for i in range(10)]
print(num)
for i in range(1,1000000000000):
li = list(str(i))
for j in li:
num[int(j)] = num[int(j)] -1
if num[int(j)] == 0:
print(i)
B直线
li = [[0 for i in range(20)] for i in range(21)]
se = set()
for i in range(21):
for j in range(20):
for m in range(1,21):
for n in range(20):
if (m==i and n ==j)or (i == m ) or (j == n):
continue
se.add((n-i)/(m-i))
print(len(se)+41)#横竖线共20+21
没有考虑截距:答案参考
se = set()
for x1 in range(20):
for y1 in range(21):
for x2 in range(20):
for y2 in range(21):
if x1== x2 or y1==y2 :
continue
k=(y2-y1)/(x2-x1)
b=(x2*y1-x1*y2)/(x2-x1)#用b=y2-k*x2就不对,可能是因为有误差吧,k本来就不太准确,
if (k,b) not in se:
se.add((k,b))
else:
continue
print(len(se)+41)#横竖线共20+21
print(se)
C货物摆放
直接暴力会超时,先找公约数,再遍历公约数
count = 0
li=[]
n = 2021041820210418
#用计算器求开方,求n的约数
for i in range(1,44955998+2):
if n%i==0:
if i not in li:
li.append(i)
if n // i not in li:
li.append(n//i)
print(li)
for i in li:
for j in li:
if n%(i*j) == 0:
count += 1
print(count)
D 路径
自己画个小点的差距,能看出来,取绝对值最大的路径最短
2021/21=96 96+1=97
思路指路–》小蓝
dp=[float('inf') for i in range(2022)]
dp[1]=0
def gong(m,n):#传入的时候,m大
c,d=m,n
while d:
c,d=d,c%d
return (m*n)//c
for i in range(1,2022):
for j in range(i+1,i+22):
if j >2021:
break
dp[j]=min(dp[j],dp[i]+gong(j,i))
print(dp[2021])
E 回路计数
暴力:先求每一个路径的互质路径,在用回溯
看别人解析,应该用的是压缩dp.太难了我不会55555555555555
l=[[]]
def huzhi(m,n):
if m<n:
m,n=n,m
for i in range(2,n+1):
if m%i==0 and n%i==0:
return False
return True
for i in range(1,22):
li=[]
for j in range(2,22):
if j == i:
continue
if huzhi(i,j):
li.append(j)
l.append(li)
li=[]
ans=[]
i=0
def backtracking(l,star):
if sum(li)==230:
if li not in ans:
ans.append(li[:])
for i in range(len(l[star])):
if l[star][i] in li:
continue
li.append(l[star][i])
backtracking(l,l[star][i])
li.pop()
backtracking(l,1)
print(len(ans))
编程
F时间显示
time = int(input())//1000
print(time)
hour = time//(60*60)
miao= time%60
f = (time - miao)%(60)
print(hour,f,miao)
def cc(h,s,c):
if h < 10:
print("0"+str(h),end=":")
else:
print(str(h),end=":")
if s < 10:
print("0"+str(s),end=":")
else:
print(str(s),end=":")
if c < 10:
print("0"+str(c))
else:
print(str(c))
cc(hour,f,miao)
G杨辉三角
n = int(input())
li= [[0]*1000 for i in range(1000)]
if n == 1:
print( 1)
li[0][0]=1
li[1][0]=1
li[1][1]=1
count = 3
flag = 0
for i in range(2,1000):
for j in range(i+1):
if j == 0 or i == j :
li[i][j] = 1
else:
li[i][j] = li[i-1][j-1]+li[i-1][j]
count += 1
if li[i][j] == n :
flag = 1
print(count)
break
if flag == 1:
break
n = int(input())
flag = 0
rowIndex = 50000
dp = [1]+[0]*rowIndex
for i in range(1,rowIndex+1):
for j in range(i,0,-1):
dp[j] += dp[j-1]
if dp[j]==n:
flag = (1+i)*(i)/2+j+1
if flag != 0:
break
if n == 1:
print(1)
else:
print(int(flag))
超时了,只能通过40
H:左孩子右兄弟
I:异或数列
J:括号序列
之前做过acwing里面有个求不同括号个数的情况跟这个挺像
统计左括号个数,深搜
#求左括号为ge时,有多少种状态
ge=int(input()
ans=[]
kong=""
def dfs(stt,l,r):
if l==r==ge:
if stt not in ans:
ans.append(stt)
if stt.count(")")>stt.count("(") or l>ge or r>ge:
return
dfs(stt+"(",l+1,r)
dfs(stt+")",l,r+1)
stt=stt[:-1]
dfs(kong,0,0)
print(len(ans)%1000000007)
s=input()
ge=abs(s.count("(")-s.count(")"))#差值
if s.count("(")>s.count(")"):
kuo=")"
else:
kuo="("
ans=[]
kong=""
def dfs(stt,start,kuo):
if start==ge and isOk(stt):
if stt not in ans:
ans.append(stt[:])
return
elif start == ge:
return
for i in range(len(stt)+1):
stt.insert(i,kuo)
dfs(stt,start+1,kuo)
stt.pop(i)
def isOk(stt):
l,r=0,0
for i in stt:
if i=="(":
l+=1
else:
r+=1
if r>l:
return False
return True
dfs(list(s),0,kuo)
print(len(ans)%1000000007)