''' 还是牛牛跳跃问题 ''' ''' [编程题] 数轴 时间限制:1秒 空间限制:65536K 牛牛非常喜欢和朋友们一起玩。 牛牛有n个朋友当前在一根数轴上,每个朋友当前在整数x[i]坐标位置。 牛牛向他们发出一个移动的信号,每个朋友就向左或者向右移动s距离(每个朋友的选择是独立的,都可以选择向左或者向右)。 为了在一起玩耍方便,牛牛希望移动之后最左边的朋友和最右边的朋友距离最近,牛牛想知道最近距离为多少。 例如牛牛有三个朋友分别所在数轴坐标为-7, 4, 7, s = 5 那么第一个朋友-7向右移动s,变为-2 第二个朋友4向左移动s,变为-1 第三个朋友7向左移动s,变为2。 现在最左和最右的朋友距离是4,没有比这个更优的方案了。 输入描述: 输入包括两行,第一行两个正整数n和s(2 ≤ n ≤ 50, 0 ≤ s ≤ 10^8),表示朋友的个数和移动的距离。 第二行包括n个正整数x[i](-10^8 ≤ x[i] ≤ 10^8),表示初始时每个朋友所在的坐标位置。 输出描述: 输出一个正整数,表示移动之后最左边的朋友和最右边的朋友最小距离为多少。 输入例子1: 3 5 4 -7 7 输出例子1: 4 ''' #跳跃后的数组 #下面这一段用一个txt来保存input的信息来模拟input.最后提交代码时候删除这一段即可. a9999=open('1.txt','r') def input(): return a9999.readline() #结束. #首先建立跳跃后的所有可能取值的list1 :list1[i]=a,b 表示i号小朋友最后能到的位置是a or b list1=[] a=[int(i) for i in input().split()] num=a[0] p=a[1] b=[int(i) for i in input().split()] for i in range(len(b)): list1.append((b[i]-p,b[i]+p)) save=[] for i in range(len(list1)): for j in range(2): tmp=list1[i][j]#下面我们讨论的情况是这个tmp如果作为最后的min值来出现那么max值最少该是多少. tmp_for_max=tmp#max值至少就是这个min值. for ii in range(len(list1)): if ii==i: continue #不能在上面tmp同一组里面取2个 tmp_max=list1[ii] a=tmp_max[0] b=tmp_max[1] if a<tmp and b<tmp: break if a<tmp and b>=tmp: out=b if a>=tmp and b<tmp: out=a if a>=tmp and b>=tmp: out=min(a,b) #为了让max尽可能的小 if out>=tmp_for_max: tmp_for_max=out else:#不出发for里面的break就是得到了符合要求的所以save一下 save.append(tmp_for_max-tmp) print(min(save))
思路就是左神的:遇到数组动态规划问题就想,以什么作为结尾,以什么作为开始,以什么作为最小值,以什么作为最大值,
用一个以什么最...样来做细化.比如这题目就是用以...作为最小值来做动态规划的细化.从而利用2维动态规划就解决了.其实也就是两个for