Помощь - Поиск - Пользователи - Календарь
Полная версия: Автомобиль на круговой дороге
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Kolyancz
Представьте себе круговую трассу, на которой на произвольном расстоянии размещены заправки, каждая с определенным объемом бензина. Кол-во бензина на всех заправках равно длине дороги. Ваш автомобиль потребляет 100 литров на 100 км и имеет неограниченный бензобак. Вопрос: в какой точке автомобиль должен начать движение, что бы у него никогда не кончался бензин во время поездки?
Дано: 2 массива, 1-ый с объемами бензина на заправках с направлении хода часов, 2-ой с расстояниями между заправками.
Как заставить два массива сравниваться подобным образом?
volvo
Цитата
Вопрос: в какой точке автомобиль должен начать движение, что бы у него никогда не кончался бензин во время поездки?
Ответ: в любой. Потому как
Цитата
автомобиль потребляет 100 литров на 100 км и имеет неограниченный бензобак
С чего бы в неограниченном бензобаке кончился бензин?

А если серьезно - ты бы условие перепроверил, что-то не очень связывается. Например,
Цитата
Кол-во бензина на всех заправках равно длине дороги
blink.gif Я уж не говорю о том, что бензин мерить километрами - как то непривычно, вопрос вообще в другом: заправился автомобиль, слил весь бензин, это значит, что больше он на эту заправку приехать не может, или бензин как-то восстанавливается на заправке? Сколько кругов автомобиль должен намотать по трассе? Сколько у него в неограниченном бензобаке есть бензина в начале пути (а то ведь можно и до первой заправки не доехать, если бензина нет изначально)?
Kolyancz
Да, условие сложно описать, проще, конечно нарисовать. Когда, я писал о том, что кол-во литров ровнокилометрам, я имел ввиду номинал. 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 км, вот и на той заправки, на которой начали.
Круг один, нужно найти способ проехать круг так, что бы бензин не кончился по пути.
Lapp
Цитата(Kolyancz @ 15.12.2008 19:18) *
в какой точке автомобиль должен начать движение, что бы у него никогда не кончался бензин во время поездки?
Забавная задачка smile.gif. Как я понимаю, исходная точка должна найтись обязательно. Возможно, она не одна, но мой код находит только первую.

Цитата(Kolyancz @ 15.12.2008 19:18) *
Как заставить два массива сравниваться подобным образом?
Сначала я сделал вторым способом, но разброс во втором массиве получился низкий. Тогда я сделал первый способ. Он значительно улучшил ситуацию, но совсем честным будет только продолжение первого цикла первого способа до достижения t=0.

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.
Kolyancz
Lapp, ты действительно гений. Очень красиво решил. Спасибо.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.