Представьте себе круговую трассу, на которой на произвольном расстоянии размещены заправки, каждая с определенным объемом бензина. Кол-во бензина на всех заправках равно длине дороги. Ваш автомобиль потребляет 100 литров на 100 км и имеет неограниченный бензобак. Вопрос: в какой точке автомобиль должен начать движение, что бы у него никогда не кончался бензин во время поездки?
Дано: 2 массива, 1-ый с объемами бензина на заправках с направлении хода часов, 2-ой с расстояниями между заправками.
Как заставить два массива сравниваться подобным образом?
Да, условие сложно описать, проще, конечно нарисовать. Когда, я писал о том, что кол-во литров ровнокилометрам, я имел ввиду номинал. 23 литра-23километра. Неограниченый бак вовсе не значит полный бак, это второстепенное условие, типа на всякий случай.
Вот напимер:
На круговой дороге стоят 5 заправок:
Первый массив показывает кол-во литров бензина на этих заправках: 4 7 5 3 4
Второй массив показывает кол-во километров между ними: 7 6 2 3 5
Видно, что всю дорогу можно проехать только лишь тогда, когда начнешь свой путь со второй заправки, т.е.
начинаем на заправке номер два: налили 7 литров проехали 6 километров, остался 1 литр, налили еще 5, проехали 2 км, осталось 4 литра, налили еще 3, проехали 3 км, осталось 4 литра, налили еще 4 литра, проехали 5 км, осталось 3 литра, налили еще 4, проехали 7 км, вот и на той заправки, на которой начали.
Круг один, нужно найти способ проехать круг так, что бы бензин не кончился по пути.
const
m=20;
var
Gas,Way: array[1..m]of integer;
Start,Tank,t,i: integer;
begin
{ Заполнение массивов }
Randomize;
t:=0;
{ первый способ}
for i:=1 to m do begin
Gas[i]:=Random(m)+1;
Way[i]:=Random(m)+1;
t:=t+Gas[i]-Way[i];
end;
for i:=1 to Abs(t) do Inc(Way[Random(m)+1],t div Abs(t));
{ второй способ }
{for i:=1 to m do begin
Gas[i]:=Random(m)+1;
t:=t+Gas[i];
Way[i]:=0
end;
for i:=1 to t do Inc(Way[Random(m)+1]);}
for i:=1 to m do WriteLn('Pump:',i:3,' Gas:',Gas[i]:3,' Way:',Way[i]:3);
{ Езда }
Start:=0;
repeat
Inc(Start);
Tank:=0;
i:=Start;
while Tank>=0 do begin
Tank:=Tank+Gas[i]-Way[i];
i:=i mod m+1;
if i=Start then break
end;
until Tank=0;
WriteLn('start at pump ',Start);
ReadLn
end.
Lapp, ты действительно гений. Очень красиво решил. Спасибо.