试题A: 卡片
n = 2021
lst = [0,0,0,0,0,0,0,0,0,0]
count = 1
while True:
for i in range(len(str(count))):
lst[eval(str(count)[i])] += 1
if max(lst)>=2021:
break
count+=1
print(lst)
print(count)
lst=[0]*10
flag=False
res=0
while flag==False:
res+=1
tmp=str(res)
for i in range(len(tmp)):
index=int(tmp[i])
lst[index]+=1
if lst[index]==2021:
flag=True
print(res)
试题B 直线
points=[[x,y] for x in range(20) for y in range(21)]
# 420个组合的点 [[0,0],[0,1]...]
nums=set()
for i in points:
x1,y1=i[0],i[1]
for j in points:
x2,y2=j[0],j[1]
if x1==x2: #特殊情况:直线垂直时斜率不存在,先跳过最后计算
continue
k=(y2-y1)/(x2-x1)
b=(x2*y1-x1*y2)/(x2-x1)
if (k,b) not in nums:
nums.add((k,b))
print(len(nums)+20)
# https://www.icode9.com/content-1-1322681.html
cnt = 0
dots = [(i, j) for i in range(20) for j in range(21)] # 生成所有点
lines = set()
for i in range(len(dots)):
for j in range(i+1, len(dots)):
if dots[j][0]-dots[i][0] != 0:
x1, x2 = dots[i][0], dots[j][0]
y1, y2 = dots[i][1], dots[j][1]
k = (y2-y1)/(x2-x1)
b = (y1*(x2-x1)-x1*(y2-y1))/(x2-x1) # 这么写不会炸精度
lines.add((k, b))
print(len(lines)+20)
# 40257
货物摆放
小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有 n nn 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。
小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆 L LL、W WW、H HH 的货物,满足 n = L × W × H n = L \times W \times Hn=L×W×H。
给定 n nn,请问有多少种堆放货物的方案满足要求。
例如,当 n = 4 n = 4n=4 时,有以下 6 66 种方案:1 × 1 × 4 、 1 × 2 × 2 、 1 × 4 × 1 、 2 × 1 × 2 、 2 × 2 × 1 、 4 × 1 × 1 1×1×4、1×2×2、1×4×1、2×1×2、2 × 2 × 1、4 × 1 × 11×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1
请问,当 n = 2021041820210418 n = 2021041820210418n=2021041820210418 (注意有 16 1616 位数字)时,总共有多少种方案
#
n=24
counts=0
memory=[]
for i in range(1,int(n**0.5)+1):
if(n%i==0):
memory.append(i)
memory.append(n//i)
# print(memory)
print(memory)
# [1, 24, 2, 12, 3, 8, 4, 6]
for i in memory:
for j in memory:
for k in memory:
if i*j*k==n:
counts+=1
# print(counts)
print(counts)
路径
def cal():# 动态规划
n=2021
dp=[float("inf")]*(n+1)
for i in range(1,22):# 初始化1-21的边相连,且最小公倍数等于其本身
dp[i]=i
for i in range(22,n+1): # 对于剩下的结点
for j in range(1,22): # 距离其结点 21范围以内的距离,肯定有一条边,找最小
dp[i]=min(dp[i],dp[i-j]+zxgbs(i-j,i))
# 如果本身的值最小即选择,如果不是,则判断前21个以内,是否有边直连
print(dp[n])
def zxgbs(a,b):
# 最小公倍数=两数相乘÷两数的最大公约数
a1=max(a,b)
b1=min(a,b)
while b1:
a1,b1=b1,a1%b1 # a1是最大公约数
# 辗转相除法,两个正整数a和b(a>b)
# 它们的最大公约数等于a除以b的余数c和b之间的最大公约数
res=a*b//a1
return res
def zxgbs2(li=[12,6,5,4]): # 多个数的最小公倍数
while len(li)!=1:
tmp=zxgbs(li[0],li[1])
li.remove(li[0])
li.remove(li[0])
li.append(tmp)
return li[0]
if __name__=="__main__":
cal()
回路计数
from math import gcd
def cal(): #
n = int(input())
m = 1 << n
# 每一位代表一栋教学楼,为1代表该教学楼已经遍历过,0代表没有遍历过(初始第1位1)
dp = [[0 for j in range(n)] for i in range(m)]
load = [[False for j in range(n)] for i in range(n)]
for i in range(1, n + 1):
for j in range(1, n + 1):
if gcd(i, j) == 1:
load[i - 1][j - 1] = True
dp[1][0] = 1
for i in range(1, m):
for j in range(n):
if i >> j & 1:
for k in range(n):
if i - (1 << j) >> k & 1 and load[k][j]:
dp[i][j] += dp[i - (1 << j)][k]
print(sum(dp[m - 1]) - dp[m - 1][0])
if __name__ == "__main__":
cal()
时间显示
import time
##days=24*60*60*1000
#### 因为time模块的单位为秒数,而题目所给的为毫秒数,所以要将题目所给的时间转化为秒数
##c=n%a # 计算当前天的余点
####求小时
##hour=c//(60*60*1000)
####求分钟
##minu=(c%(60*60*1000))//(60*1000)
####求秒钟
##sec=(c%(60*1000))//1000
##print('%02d'%hour,end=':')
##print('%02d'%minu,end=':')
##print('%02d'%sec,end='')
n=int(input())
n=n//1000
result=time.strftime('%Y-%d-%m %X',time.gmtime(n))
print(result) # 2021-18-04 01:08:23
print(result[-8:])
左孩子右兄弟
5
1
1
1
2
4
def combia(candidates,target):
candidates.sort()
n=len(candidates)
res=[]
def back(i,tmp_sum,tmp):
if tmp_sum>target or i==n: # 如果超出条件、或者到最后一个,退出到上一层
return
if tmp_sum==target: # 如果满足目标,将临时答案加入
res.append(tmp)
for j in range(i,n):# 如果未满足,继续
if tmp_sum+candidates[j] > target:# 如果新加入节点超出预期,终止本次(剪枝)
break
back(j,tmp_sum+candidates[j],tmp+[candidates[j]])# 否则,继续深入,将本次的起点位置,临时结果,临时数值传递给下一届
back(0,0,[])# 初始
return res
print(combia(candidates = [2,3,6,7], target = 7))
res.append(tmp)
for j in range(i,n):# 如果未满足,继续
if tmp_sum+candidates[j] > target:# 如果新加入节点超出预期,终止本次(剪枝)
break
back(j,tmp_sum+candidates[j],tmp+[candidates[j]])# 否则,继续深入,将本次的起点位置,临时结果,临时数值传递给下一届
back(0,0,[])# 初始
return res
print(combia(candidates = [2,3,6,7], target = 7))