博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
牛客网 跳石板
阅读量:4169 次
发布时间:2019-05-26

本文共 2051 字,大约阅读时间需要 6 分钟。

题目:跳石板

题目描述

小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3.......

这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。
例如:
N = 4,M = 24:
4->6->8->12->18->24
于是小易最少需要跳跃5次,就可以从4号石板跳到24号石板

输入描述:

输入为一行,有两个整数N,M,以空格隔开。 (4 ≤ N ≤ 100000) (N ≤ M ≤ 100000)

输出描述:

输出小易最少需要跳跃的步数,如果不能到达输出-1

示例1

输入

4 24

输出

5

自己的解法思路为:建立一个M+1的数组,数组元素为-1,N位置为0,获取N的约数,并且前进,对应到达位置设置为当前步数,代码如下,复杂度过高,没有提交成功:

N,M=[int(each) for each in input().split()]def getNYueShu(n):    mid=n//2    result=[]    for i in range(2,mid+1):        if i not in result:            # 判断是否是约数            if n%i==0:                result.append(i)                j=int(n/i)                if j not in result:                    result.append(j)    return resultdef getCounts(N,M):    # ys=getNYueShu(N)    # ys=sorted(ys,reverse=True)    count=0    step=[-1]*(M+1)    step[N]=0    cur_val=[N]    while cur_val:        next=[]        count+=1        #print(count)        for j in cur_val:            ys=getNYueShu(j)            ys = sorted(ys, reverse=True)            for i in ys:                if j+i<=M and i+j not in next:                    next.append(i+j)        tmp_next=[]        for n in next:            if step[n]==-1:                step[n]=count                tmp_next.append(n)                if n==M:                    break        cur_val=tmp_next    return step[M]print(getCounts(N,M))

参考解法:

def solution(n, m):    divs = [[] for _ in range(m + 1)]    for i in range(2, m + 1):        t=[j for j in range(i + i, m + 1, i)]        for j in range(i + i, m + 1, i):            divs[j].append(i)    value = [m] * (m + 1)    value[n] = 0    for i in range(n, m + 1):        if value[i] < m:            for x in divs[i]:                if i + x < m + 1:                    value[i + x] = min([value[i + x], value[i] + 1])    if value[m] < m:        return value[m]    else:        return -1data = [int(i) for i in input().strip().split()]n = data[0]m = data[1]print(solution(n, m))

理解的思路是:先求出可达位置的约数,然后在接下来的for循环中去设定每个可达位置的最短步数

转载地址:http://xeyai.baihongyu.com/

你可能感兴趣的文章
Oracle 11g RAC SCAN basics
查看>>
ASM appears to be running, but connect via sqlplus, says idle instance.??
查看>>
Oracle EBS R12 - Steps and Issues/Resolutions during R12.1.1 to R12.1.3 Upgration
查看>>
HW的最后一轮面试
查看>>
简易Python电话本(Simple Python Telephone Book)
查看>>
经典影视日语
查看>>
JPad 1.00(20081213)
查看>>
test the difference between "DEFAULT NULL" and "DEFAULT 0"
查看>>
一个非常方便好用的ADO数据库连接字符串生成工具
查看>>
轻松得到C# ADO.NET的各种数据库连接字符串
查看>>
DLL文件制作与在VBA调用初级进阶
查看>>
Excel VBA: Delete Module After Running VBA Code. Deleting Modules via VBA Code
查看>>
SQLPLUS 使用的一些技巧
查看>>
excel 宏表函数 get.cell
查看>>
Recover Deleted Linux Files With lsof
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 01 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 02 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 03 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 04 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 05 exercise
查看>>