我正在研究这个问题,任何关于性能改进、bug或代码风格问题的建议都会受到欢迎。
描述在一条长M公里的直公路上有N个加油站.第一个加油站离高速公路的起点有几公里远.(保证高速公路两端各有一个加油站。)现在市长可以建造更多的加油站了。他想把相邻两个加油站之间的最大距离降到最小。你能帮他吗?输入:第一行包含3个整数N,M,k。(2 <= N <= 1000,1 <= M,K <= 100000)第二行包含N个整数,A1,A2,.一个。(0 = A1 <= A2 <= . <= AN = M)输出:最小最大距离四舍五入到小数位。样本输入3 10 2 0 2 10样本输出2.7
我的主要想法是:
def max_gas_distance(distances, k):
max_distance = 0
for i, v in enumerate(distances):
if i > 0:
max_distance = max(max_distance, v - distances[i-1])
# final result between 1 and max_distance
l = 1.0
h = max_distance
while l <= h:
mid = l + (h-l)/2.0
if valid(distances, mid, k):
h = mid - 0.1
else:
l = mid + 0.1
return l
def valid(distances, mid, k):
additional_gas_station = 0
for i,v in enumerate(distances):
if i > 0 and v - distances[i-1] > mid:
additional_gas_station += (v - distances[i-1]) / mid
if additional_gas_station >= k+1:
return False
return True
if __name__ == "__main__":
existing_gas_stations = [0,2,10]
k = 2.0
print max_gas_distance(existing_gas_stations, k)发布于 2017-02-11 22:54:35
(v - distances[i-1]) / mid,如果车站之间的距离是6,mid是3,结果是2,而你只需要增加1个加油站。你真正想做的是得到distance / mid的上限,它会给出长度mid的数量,然后减去一个,得到中间的加油站数量。所以math.ceil(distance / mid) - 1。总的来说,我认为代码非常干净,具有清晰的变量名和良好的模块化。
valid并不是真正可读的,而且变量名称mid和k也没有表现力。所以我会把它重命名为。Is_solvable(距离,distance_required,additional_stations)https://codereview.stackexchange.com/questions/155102
复制相似问题