Показать сообщение отдельно
  #12  
Старый 15.11.2006, 18:20
Аватар для Rom@NS
Rom@NS Rom@NS вне форума
Прохожий
 
Регистрация: 05.11.2006
Адрес: Россия
Сообщения: 18
Репутация: 10
Вопрос

И вот еще одни вариант... и снова не верный. Вроде как принцип такой, но вот ответ неверный! Узнать бы хотя бы сколько надо бензина, тогда можно было бы подогнать алгоритм под этот ответ!!! А так когда не знаешь к чему стремиться совсем не в жилу решать задачи подобного типа!

//Имеется пустыня длиной 500 км, автомобиль с баком на 100 л,
//который может перевезти до 2-х канистр по 25 л
//Расход бензина 1 л/км
//Необходимо найти наименьшее количество бензина
//которое потребуется что бы проехать пустыню

unit upust;
interface
const S = 500;
bak=100;
konistri=25;

type tkm=record
next:integer;
liter:integer;
end;
tpust=array[0..S]of tkm;

procedure fill(var p:tpust);

implementation
function Distanse(x,y:integer;benz:integer):integer;
var
Vway,Vdost,Vf:integer;
begin
//x начальная точка
//y-конечная точка
Vway:=150-(y-x)*2;//можно доставить за раз при длине пути y-x
Vdost:=0;//количество доставленного бензина в j точку
Vf:=0;//количество израсходованого бензина на доставку

while Vdost<benz do
begin
if (benz-Vdost)<150-(y-x)//если количество бензина которое можно увезти
then //за раз меньше количества которое осталось доставить тогда
begin
Vdost:=benz;
Vf:=Vf+(y-x);
end
else
begin
vf:=vf+(y-x)*2;//сделать рейс
Vdost:=Vdost+Vway//увеличить количество доставленого
end;
end;
result:=Vf+Vdost;
end;


procedure fill(var p:tpust);
var i,j,ras,reis,ben:integer;
begin
//Заполняем от 350 до 500
for i:=S downto S-bak-2*konistri do
begin
p[i].liter := S-i;
p[i].next := S;
end;
ras := (bak + 2*konistri -1) div 2;
//Заполнение от 349 до 0
for i := S - bak-2*konistri -1 downto 0 do
begin
p[i].liter := maxint;
p[i].next:=i;
for j:=1 to ras do //Выбираем оптимальное расстояние до следующей точки
begin
//кол-во топлива необх чтобы доехать из точки i до конца
ben :=distanse(i,i+j,p[i+j].liter);
if p[i].liter > ben
then
begin
p[i].next := i+j; //след точка в ко-ю мы можем попасть из i
p[i].liter := ben; //кол-во бензина чтобы доехать до конца
end;
end;
end;
end;//filL
// ben := 2*j*(reis-1)+j+p[i+j].liter+(p[i+j].liter mod 50);
// ben := 2*j*(reis-1)+j+(150-j)+(p[i+j].liter-p[i+j].liter mod 50);
//2*j*(reis-1)+(150-2*j)*(reis-1)+j+(150-j);
end.
Ответить с цитированием