题目要求:
''' 一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。 设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。 对于给定的n(n <= 5000)和k(k <= 1000)个加油站位置,编程计算最少加油次数 '''
分析:
1、首先明确,一段路程,k个加油站,有k+1段路程。即: k=len(distance)-1
2、如果这k+1段路程中,任意一段路程大于n,反馈空,此题结束。
3、如果k+1段路程都是小于n的。用while循环嵌套while循环,计算次数。
i为路程位置,length后每次加满后要跑的距离,num为加油次数,都初始化为0.
里面的while循环:以length长度为判断是否循环条件
length=length+distance[i],如果length小于n,i的位置往后移一位,继续执行length=length+distance[i],直到length大于等于n,跳出内部的while循环,num加1,length初始化为0。
外面的while循环:以i位置为判断是否循环条件
length=length+distance[i]
当i小于k时, length=length+distance[i],执行内部while循环移动i的位置,每次内部循环跳出,num加1,length初始化为0。直到i==k,跳出外循环。返回最后的num
代码:
def greedy(n,distance): #n是汽车加油加满后能跑的最长里程 #distance是路程中各段距离列表 #k是加油站个数 k=len(distance)-1 print('k',k) for i in range(k+1): if distance[i]>n: return i=0 #length后每次加满后要跑的距离 length=0 #num为加油次数 num=0 while i <k: print('i1',i) print('distance[i]',distance[i]) length=length+distance[i] print('length0',length) while length<n: i=i+1 print('i2',i) length=length+distance[i] print('length1',length) if length>= n: break num=num+1 print('num0',num) length=0 if i==k: break print('num',num) return num if __name__ == '__main__': n=100 distance=[50,80,39,60,40,32,10,50,80] result=greedy(n,distance) print('最少加油次数',result)
运行结果
k 8
i1 0
distance[i] 50
length0 50
i2 1
length1 130
num0 1
i1 1
distance[i] 80
length0 80
i2 2
length1 119
num0 2
i1 2
distance[i] 39
length0 39
i2 3
length1 99
i2 4
length1 139
num0 3
i1 4
distance[i] 40
length0 40
i2 5
length1 72
i2 6
length1 82
i2 7
length1 132
num0 4
i1 7
distance[i] 50
length0 50
i2 8
length1 130
num0 5
num 5
最少加油次数 5