目录
1.打包(算法提高)二分
def check(k):
t=1
summ=a[0]
for i in range(1,n):
if summ+a[i]<=k:
summ+=a[i]
else:
t+=1
summ=a[i]
if t<=m:
return True
return False
n,m=map(int,input().split())
a=list(map(int,input().split()))
l=max(a)
r=sum(a)
while l<r:
mid=(l+r)//2
if check(mid):
r=mid
else:
l=mid+1
print(r)
2.约数个数(算法提高)
4/1=4 4/2=2 4/3=1 4/4=1 加起来是8
n=int(input())
sum=0
for i in range(1,n+1):
sum+=n//i
print(sum)
3.寻找三位数(算法提高)
from itertools import *
s=['1','2','3','4','5','6','7','8','9']
for x in permutations(s):
p=''.join(x)
a=p[0:3]
b=p[3:6]
c=p[6:9]
a=int(a)
b=int(b)
c=int(c)
if a*2==b and a*3==c:
print(a,b,c)
4.第二点五个不高兴的小明
n,p,t=map(int,input().split())
a=list(map(int,input().split()))
a.append(0)
dp=[[-float('inf') for i in range(1050)]for j in range(1050)]
for i in range(min(p,n)):
dp[0][i]=a[i]
for i in range(1,t):
for j in range(1,n+1):
for k in range(1,p+1):
if j-k>=0:
dp[i][j]=max(dp[i-1][j-k]+a[j],dp[i][j])
print(dp[t-1][n])
5.螺旋矩阵(模拟题)
dir=[(0,1),(1,0),(0,-1),(-1,0)]
x=0
y=0
d=0
a=[[0 for i in range(30)]for j in range(30)]
vis=[[0 for i in range(30)]for j in range(30)]
a[x][y]=1
vis[x][y]=1
for i in range(2,901):
nx=x+dir[d][0]
ny=y+dir[d][1]
if 0<=nx<30 and 0<=ny<30 and vis[nx][ny]==0:
vis[nx][ny]=1
a[nx][ny]=i
x=nx
y=ny
else:
d=(d+1)%4
nx=x+dir[d][0]
ny=y+dir[d][1]
a[nx][ny]=i
vis[nx][ny]=1
x=nx
y=ny
print(a[19][19])
5.汉诺塔
a,b,c=map(int,input().split())
l=a+b+c
p=[0 for i in range(l+1)]
for i in range(1,4):
a=list(map(int,input().split()))
for j in a:
p[j]=i
def hanoi(n,k):
if n==0:
return 0
if p[n]==k:
return hanoi(n-1,k)
return hanoi(n-1,6-k-p[n])+2**(n-1)
print(hanoi(l,3))