Preguntas de algoritmo-python (3)

Algunas preguntas muy coincidentes que ciertamente no pensé en


numero mas grande

# 贪心...
# A次:+
# 加法 加到9再加1变成0 
# B次:-
# 减法 减到0再减1变成9

# 关于加法!!!
# 设当前位是x s = [x0,x1,x2,...,xn]
# 想知道加到9要花多少次?
# 这里递推:
# 0->9 加9次
# 1->9 加8次
# 2->9 加7次
# ...
# x->9 加9-x次

# 加到9就停止,留着次数加下一位的...
# 设当前位使用的加的次数为 add = min(9-x,A)
# 总次数要是比9-x小就用A,否则用9-x,因为这样可以有富余的A-add下一次使用
# max的话一下子把次数用完了...
# 为什么不直接用9-x?因为次数可能不够9-x,所以还得比较 

# 关于减法!!!
# 减法只有达到0后再减一才有用
# 所以再递推减到9要花多少次
# 0->9 减1次
# 1->9 减2次
# 2->9 减3次
# ...
# x->9 减x+1次
# 减到9就停止,留着次数减下一位的
# 什么时候用减法??
# 当前位有可能被减到9的时候... 即 x+1<=n 如果怎么减都不能是9,就不做操作...
# n<x+1的时候就是不可能到9
c,a,b = map(int,input().split())
s = str(c)
l = [int(x)for x in s]
# dfs
res = 0
def dfs(k,cur,a,b):
    global res
    if k<len(l):
        temp = l[k]
        add = min(a,9-temp)
        dfs(k+1,cur*10+add+temp,a-add,b)# 为什么不是cur*10+add,因为cur开始的时候是0啊...这样只会有add...
        if temp+1<=b:# 只有能减到9是可以做的...相当于+9....temp+1<=n
            dfs(k+1,cur*10+9,a,b-temp-1)
    else:
        res = max(cur,res)

dfs(0,0,a,b)
print(res)

camino

## 9 15
## a = 9 b =15
## a=b%a = 6 b=a=9
## a=b%a = 3 b=a=6
## a=b%a = 0 b=a=3 return b

def gcd(a,b):
    if a==0:
        return b
    return gcd(b%a,a)

def gongbeishu(a,b):
    return a*b//gcd(a,b)

# abs(a-b)>21 -> 0
# abs(a-b)<=21 -> gongbeishu(i,j)
# 直接暴力????没有思路是这样的
# 先初始化所有为最大 float('inf') 正无穷 float('-inf') 负无穷
dp = [float('inf')]*2022
dp[1]=0 # 初始化第一个节点的距离 是0 因为是自己到自己的距离
# 从节点1开始 左闭右开range(1,n) ->[1,n)
# dp[i] 记录从第i个点到第1节点的最短路
for i in range(1,2022):
    for j in range(1+i,i+22):
        if j>2021:
            break
        dp[j] = min(dp[j],dp[i]+gongbeishu(i,j))
print(dp[2021])


número primo

def CountPrim(N):#[0,N-1]有多少个素数 线性筛极速版
    count = 0
    sign = [True]*N
    for i in range(2,N):
        if sign[i]==True:
            count+=1
            for j in range(2*i,N,i):
                sign[j]=False
    return count

def is_prime(N):
    if N == 1: return False
    if N ==2 : return True
    if N>2:
        for i in range(2,int(N**0.5)+1):
            if N%i==0:
                return False
        return True
    
def SIX_N_prime(N):
    if N==1: return False
    if N==2 or N==3:
        return True
# 不满足形如6n+1和6n+5 直接筛去
    if N%6!=1 and N%6!=5:
        return False
    for i in range(5,int(N**0.5)+1,6):# 步长是6 当n=0时,从5开始
        if N%i == 0 or N%(i+2) == 0: #能被i整除 或是 能被i+2整除 六倍邻数可能是素数也可能是合数
            # 为什么用i+2 用例子证明:i+2 2是6n+1和6(n+1)+5相邻数的差值...
            return False
    return True


línea recta

# 遍历斜率
N = 20
M = 21
l = []
for i in range(0,N):
    for j in range(0,M):
        l.append((i,j))
##print(l)
# 平行的也算...
# 要计算kx+b=y 而且不能重复... b = y-kx
s = set()# 存(k,b)
samex = set() # 存平行x轴的
samey = set() # 存平行y轴的
for i in range(0,len(l)):
    tx,ty = l[i]
    for j in range(i+1,len(l)):
        ax,ay = l[j]
        if ax == tx:
            samex.add(ax)
        elif ty == ay:
            samey.add(ay)
        else:
            k = (ay-ty)/(ax-tx)
            b = ty-k*tx
            # 浮点数精度问题使用的是1e-8...也不知道为何? 反正默认吧...
            s.add((round(k,8),round(b,8)))
print('s:{}'.format(len(s)))
print('samex:{}'.format(len(samex)))
print('samey:{}'.format(len(samey)))
ans = len(s)+len(samex)+len(samey)
print('sum:{}'.format(ans))


Colocación de carga

# 求因数的组合数... 因数包含[1,n]
n = 2021041820210418
s = set()
for i in range(1,int(n**0.5)):
    if n%i==0:
        s.add(i)
        s.add(n//i)
count = 0
for i in s:
    for j in s:
        for k in s:
            if i*j*k==n:
                count+=1
print(count) # 2430

buscando un cambio

# 只有7种不同面值的纸币 1 2 5 10 20 50 100
coin = [100,50,20,10,5,2,1]
n = int(input())
value = list(map(int,input().split()))
value = value[::-1]
num = 0
for i in range(7):
    # 只要总钱数不为0 就一直减掉兑换的钱数
    if n>0:
        temp = n//coin[i]
        zhaoling = min(temp,value[i])
        num+=zhaoling
        n-= zhaoling*coin[i]
print(num)
############
# 150
# 3 0 2 1 0 3 5
############

Cambiar - 1
 

coin = [1,4,16,64,1024]
# 用1024买价值为n的东西,找零钱用最小多少硬币
n = int(input())
target = 1024-n
coin = coin[::-1]
zhaoling = 0
for i in coin:
    if target>0:
        t = target // i
        target -= t*i
        zhaoling += t
print(zhaoling)

Supongo que te gusta

Origin blog.csdn.net/daxuanzi515/article/details/129967686
Recomendado
Clasificación