算法竞赛入门第七章(1):暴力枚举

    xiaoxiao2025-05-01  5

    1 :此题比较简单,先写一个10取5的排列函数,然后进行进行查表。当然如果解约空间就可以直接循环加判定字母是否重复来解。

    def create(m,obj = list(range(10))): def remove_2(x,L): L = L[::] L.remove(x) return L ans = [] if m==0:return [0] for i in obj: ans_tmp = create(m-1,remove_2(i,obj)) for each in ans_tmp: ans.append(i*10**(m-1)+each) return ans def proc(): obj = set(create(5)) n = int(input()) for i in obj: if i*n in obj:print('{0}/{1}={2}'.format(str(i*n).zfill(5),str(i).zfill(5),n)) proc()

    例题2:此题当然可以直接枚举,但是更加简单的办法是采用累加数组这个概念(在编程珠玑里面重点介绍),然后 S[i+1j]=S[j]S[i] ,我们只需要找到S[0]到S[j-1]里面的最小值即可。这样以O(N)的复杂度就解决问题。

    (a): 注意一个细节,当累乘的值等于0时要将所有的值都重新初始化一遍,这是因为如果我们无法计算乘上0再除以0的结果。所以一旦某个值为0,那么就应该从头开始。

    def proc(): n = int(input()) S = [1]+[float(x) for x in input().split()] min_p,min_n = 1,1 M,ans = 1,0 for i in range(1,n+1): M *= S[i] if M==0:M,min_p,min_n=1,1,1;continue ans_tmp = max(M/min_p,M/min_n) ans = max(ans,ans_tmp) if M>0:min_p = min(min_p,M) elif M<0:min_n = max(min_n,M) return ans

    3 :经过简单的分析计算,可以发现 k+1y2k ,那么只要在这个基础之上进行枚举就可以了。

    def fractions(): k = int(input()) for y in range(k+1,2*k+1): x = (k*y)//(y-k) if x*y==k*(x+y):print('1/{0} = \ 1/{1} + 1/{2}'.format(k,x,y)) fractions()
    转载请注明原文地址: https://ju.6miu.com/read-1298656.html
    最新回复(0)