Problem (Fine 1947, Phipps 1947). A jeep holds 1 unit of fuel and drives 1 unit of distance per unit of fuel. At the base there are units. The jeep may leave fuel in depots anywhere along its way and pick it up later. How far into the desert can it get (exploration: one way), and how far can it get and still come back (round trip)?
| Variant | Maximum distance with units | Growth |
|---|---|---|
| one way (exploration, “desert crossing”) | ||
| round trip (back to base) | ||
| fractional fuel , | add (one way) or (round trip) | |
| fuel needed for distance | exponential in : about up to a constant factor |
| 1 | 2 | 3 | 4 | 5 | 10 | |
|---|---|---|---|---|---|---|
| one way | 1 | 1.333 | 1.533 | 1.676 | 1.787 | 2.133 |
| round trip | 0.5 | 0.75 | 0.917 | 1.042 | 1.142 | 1.464 |
Plan (one way). Work backwards from the end: with units at a depot, move them all forward by using trips forward and trips back ( traversals, one unit burnt), arriving with units; finally drive the last full tank 1 unit.
double jeepOneWay(double f) { // f >= 1 units of fuel
int n = int(f); double r = f - n, d = r / (2 * n + 1);
for (int k = 1; k <= n; k++) d += 1.0 / (2 * k - 1);
return d;
}
double jeepRoundTrip(double f) {
int n = int(f); double r = f - n, d = r / (2 * n + 2);
for (int k = 1; k <= n; k++) d += 1.0 / (2 * k);
return d;
}
// Simulate the one-way plan for integer n, checking tank and depot accounting. Returns the distance reached.
double simulateJeep(int n) {
double pos = 0, depot = n; // all remaining fuel sits at the current depot
for (int k = n; k >= 2; k--) {
double step = 1.0 / (2 * k - 1), next = 0;
for (int trip = 1; trip <= k; trip++) {
double take = min(1.0, depot); depot -= take; // fill the tank (capacity 1)
double tank = take - step; // drive forward
assert(tank >= -1e-12);
if (trip < k) { double drop = tank - step; assert(drop >= -1e-12); next += drop; } // keep just enough to drive back
else next += tank; // last trip: stay at the new depot with everything
}
assert(depot < 1e-9); pos += step; depot = next;
assert(fabs(depot - (k - 1)) < 1e-9);
}
return pos + min(1.0, depot); // final full tank
}Proof: the plan works and nothing can go further
Plan. At a depot with units, trips each fill the tank: the first trips drive , drop and return; the last drives and stays. Fuel arriving at the new depot: , and the tank never exceeds 1. So from units the jeep reaches with exactly one unit, then drives 1 more. A fractional amount is moved first: with units, trips forward and back burn ; choosing leaves exactly units. Round trip: every forward traversal is matched by a return, so each stage uses traversals and advances .
Upper bound (one way). For let be the net fuel carried across the point outward over the whole trip; since all fuel starts at the base, equals the fuel burnt or left beyond , so is non-increasing, , and for every the jeep passes. Each outward crossing of carries at most 1 unit, so there are at least of them; as the jeep finishes beyond , it crosses back one time fewer. For , the fuel burnt inside is at most (it crossed outward and did not cross ), and it is at least times the number of traversals of the interval, at least . Hence while lies in it falls at rate at least per unit of distance, so the jeep can cover at most while is in that band (at most in the top band ). Summing the bands gives the formula. Round trip: inward crossings equal outward ones, so the rate is at least and the bound is . Growth: and . Checked: the simulated plan reaches
jeepOneWay(n)for with all tank and depot checks passing.
Related notes
- Harmonic Lemma and Floor Sums
- Ant on a Rubber Rope (another harmonic-series puzzle)
- Bridge and Torch (shuttling resources)