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

Есть следующий выриант решения этой задачи на С++, но в нем где то есть небольшая ошибка, а так я не знаю С++, то естественно этой ошибки не могу найти.
Может кто переведет мне этот код на Delphi.... а заодно и ошибку увидит...

B — бак
K — канистра
L — расстояние
Решать начал с конца т.е от 350 до 500 км мы можем проехать без проблем (500 — бак -две_канистры) =500-150=350.
Теперь нам необходимо заполнить от 350 до 0.
Заполнение такое: считаем максимальное расстояние которое мы можем проехать на двух канистрах и баке, что то оставить, и вернуться. ras=(B+2*K)/2-1; т.е 74 км.
Потом считаем сколько бензина можем оставить в j точке, при том, что надо ещё и вернуться (ost=B+2*K-2*j) оставить больше двух канистр не можем, а меньше можем.
Далее считаем количесвто рейсов необходимое чтобы перевезти бензин в j точку (reis=(pust[i+j].liter-(B-j)-1)/ost+1)
здесь значит так: (литров_до_конца — в_баке_now-1)/ost+1
Рассчитываем количество бензина необходимое из данной точки чтобы доехать до конца (ben=pust[i+j].liter+reis*j+(reis-1)*j)

А вот реализация этого алгоритма:



#define L 500 //расстояние которое необходимо проехать
#define K 25 //канистры
#define B 100 //бак

typedef struct _Pust_struct
{
int next; //следующий километр
int liter; //сколько литров до конца
} Pust_struct;

void do_it(Pust_struct* pust)//процедура подсчёта
{

int ost,reis,ben;

for(int i=L-1;i>L-B-2*K-1;i--) //заполняем с конца или от 500 до 350
{
pust[i].liter=L-i;
pust[i].next=L;
}

int ras=(B+2*K)/2-1; //считаем максимальное расстояние которое можем проехать, что то оставить, и вернуться.

for(int i=L-B-2*K-1;i>=0;i--) //начинаем заполнять
{
pust[i].liter=0xFFFFFFF; //очень большое число для сравнения
pust[i].next=i;
for(int j=1;j<ras;j++)
{
ost=B+2*K-2*j; //считаем сколько можем оставить при условии того, что надо ещё и вернуться

if (ost>2*K) ost=2*K; //округляем

reis=(pust[i+j].liter-(B-j)-1)/ost+1; //количество рейсов необходимое что бы перевезти бензин
//из i-ой точки в j-ую

ben=pust[i+j].liter+reis*j+(reis-1)*j;//количество топлива необходимое, что бы доехать
//до конца из i+j точки

if (pust[i].liter>ben)//выбираем оптимальное количество топлива
{
pust[i].next=i+j; //следующая точка в которую мы можем попасть из i-ой
pust[i].liter=ben;//количество бензина что бы доехать до конца
}
}
}
}

int main()
{
int i=0;
Pust_struct p[L]; //массив

do_it(p);//выполняем все вычесления
//вывод всего
//for (i=0;i<L;i++)printf("point= %d\t liter= %d\t next= %d\t\n",i,p[i].liter,p[i].next);

//вывод решения
int temp=p[0].next;
printf("point= %d\t liter= %d\t next= %d\t\n",0,p[0].liter,p[0].next);

for(i=0;i<L;i++)
{
if (i == temp)
{
printf("point= %d\t liter= %d\t next= %d\t\n",i,p[i].liter,p[i].next);
temp=p[i].next;
}
}


return 0;
}
Ответить с цитированием