寻友之旅20230214

113 阅读1分钟

当青训营遇上码上掘金

小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)

求小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)

1. 题目简析

小青要从地点N到达地点K(0<=N,K<=100000),单位时间内移动可到达的地点为X-1或X+1或2*X

2.分析
  • 情况一:N>K时,小青只能步行,每单位时间内移动-1直到到达小码家,时间为(N-K)分钟;

  • 情况二:N=K时,大概不会有这种情况……

  • 情况三:N<K时,小青可以直接步行前进抵达,也可先步行再公交再步行前进或公交以后再逆行抵达,可采用动态规划。X=N时time=0,X=N+1或X=N-1或X=2N时time=1.对于其他状况下,time(X)=min(time(X-1)+1,time(X+1)+1,time(X/2)+1,time(2N)+2*N-X)

    对于情况三分两步讨论,先动态规划计算不逆行的情况下可以达到的最短时间,再取timedict[K]与逆行情况下(timedict[2i]+2i-K)的时间取最小值。

3.补充知识

动态规划算法的显著优势在于根据上一结果求解当前结果,最佳情况下时间复杂度可以达到O(n).动态规划算法的常见应用是求解爬楼梯问题(每次向上爬一个或两个台阶,问最少走几步能到楼顶),当x=0时step=0,当x=1时step=1,后面遍历求解x=2,3,4……,n的情况,step[x]=min(step[x-1]+1,step[x-2]+1).最后取出step[n]即为所求。 本题的难点在于,在N<K的情况下,小青有可能先走到大于K的地点再往回走,如N=45,K=85时,若只步行则time=84-45=40,若坐公交再逆行则time=1+90-85=6;再如N=40,K=85时,若先公交再步行time=1+85-80=6,若步行至42-公交至84-步行至85,则time=2+1+1=4.

4.总结

题目很烧脑,不知道能不能写出AC的代码,加油~

当当当~python3代码如下

  N=40
  K=85
  #1.N>=K
  if(N>=K):
    print(N-K)
    return N-K
  #2.N<K(不逆行的情况下)
  timedict={}
  temp=N
  timedict[N]=0
  timedict[N-1]=timedict[N+1]=timedict[2*N]=1
  for i in range(N+2,2*K+1):
    timedict[i]=timedict[i-1]+1
    if i%2==0 and i//2>=N:
      timedict[i]=min(timedict[i-1],timedict[i//2])+1
  #3.判断可逆行的情况下是否有更短时间的方案
  res=timedict[K]
  for i in range((K+1)//2,K+1):
    res=min(timedict[2*i]+2*i-K,res)
    #print(i,res,timedict[K],timedict[2*i])

  print(res)
  #print(timedict[K],res,sorted(timedict.items()))
  return res
if __name__ == '__main__':
  main()