到达目的地的最少停留
minimum stop to get to destination
Class GasStation {
int distanceToDestination;
int availableGas;
}
给定三个参数g表示车辆初始油量,d表示到目的地的距离。和 gasStations 列表,其中每个 gasStation 的变量是 distanceToDestination,第二个是该站的 availableGas。如何计算到达目的地的最小停靠点?
g = 10 gallon,
d = 20 miles,
list of GasStation:
gasStations = [[15, 1], [14,10], [12,12]].
编辑:没有容量限制。
既然你没有提到它,我假设你需要 k
加仑汽油才能行驶 1
英里。如果总容量不是太大,这可以通过 DP 来解决。我已经概述了一个使用递归和记忆的解决方案。
gasStations = [list of GasStations]
sort gasStations by decreasing value of distanceToDestination if its not already sorted
k : gas required to travel 1 mile
maxNumberOfGasStation : maximum gas stations possible
maxPossibleCapacity : maximum gas that might be required for a trip
memo = [maxNumberOfGasStation][maxPossibleCapacity] filled up with -1
int f(idx, currentGas) {
if (G[idx].distanceToDestination * k <= current_gas) {
// You can reach destination using the gas you have left without filling any more
return 0
}
if(idx == gasStations.length - 1) {
// last station
if (G[idx].distanceToDestination * k > current_gas + G[idx].availableGas) {
// You cannot reach destination even if you fill up here
return INT_MAX
} else{
return 1;
}
}
if(memo[idx][currentGas] != -1) return memo[idx][currentGas];
// option 1: stop at this station
int distBetweenStation = G[idx].distanceToDestination - G[idx+1].distanceToDestination
int r1 = 1 + f(idx+1, min(currentGas + G[idx].availableGas, maxPossibleCapacity) - distBetweenStation * k)
// option 2: don't stop at this station
int r2 = f(idx+1, currentGas - distBetweenStation * k)
// take minimum
int r = min(r1, r2)
memo[idx][currentGas] = r
return r;
}
要接听电话f(0, g - (d - gasStations[0].distanceToDestination) * k)
。时间复杂度为 O(maxNumberOfGasStation * maxPossibleCapacity)
。如果有 capicity
限制,您可以简单地用它替换 maxPossibleCapacity
。
Class GasStation {
int distanceToDestination;
int availableGas;
}
给定三个参数g表示车辆初始油量,d表示到目的地的距离。和 gasStations 列表,其中每个 gasStation 的变量是 distanceToDestination,第二个是该站的 availableGas。如何计算到达目的地的最小停靠点?
g = 10 gallon,
d = 20 miles,
list of GasStation:
gasStations = [[15, 1], [14,10], [12,12]].
编辑:没有容量限制。
既然你没有提到它,我假设你需要 k
加仑汽油才能行驶 1
英里。如果总容量不是太大,这可以通过 DP 来解决。我已经概述了一个使用递归和记忆的解决方案。
gasStations = [list of GasStations]
sort gasStations by decreasing value of distanceToDestination if its not already sorted
k : gas required to travel 1 mile
maxNumberOfGasStation : maximum gas stations possible
maxPossibleCapacity : maximum gas that might be required for a trip
memo = [maxNumberOfGasStation][maxPossibleCapacity] filled up with -1
int f(idx, currentGas) {
if (G[idx].distanceToDestination * k <= current_gas) {
// You can reach destination using the gas you have left without filling any more
return 0
}
if(idx == gasStations.length - 1) {
// last station
if (G[idx].distanceToDestination * k > current_gas + G[idx].availableGas) {
// You cannot reach destination even if you fill up here
return INT_MAX
} else{
return 1;
}
}
if(memo[idx][currentGas] != -1) return memo[idx][currentGas];
// option 1: stop at this station
int distBetweenStation = G[idx].distanceToDestination - G[idx+1].distanceToDestination
int r1 = 1 + f(idx+1, min(currentGas + G[idx].availableGas, maxPossibleCapacity) - distBetweenStation * k)
// option 2: don't stop at this station
int r2 = f(idx+1, currentGas - distBetweenStation * k)
// take minimum
int r = min(r1, r2)
memo[idx][currentGas] = r
return r;
}
要接听电话f(0, g - (d - gasStations[0].distanceToDestination) * k)
。时间复杂度为 O(maxNumberOfGasStation * maxPossibleCapacity)
。如果有 capicity
限制,您可以简单地用它替换 maxPossibleCapacity
。