Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Результаты опроса: На ваш взгляд это сложная задача?
Очень сложная 0 0%
Сложная 3 75.00%
Простая 0 0%
Очень простая 1 25.00%
Голосовавшие: 4. Вы еще не голосовали в этом опросе

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 25.12.2006, 18:30
Аватар для 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
//вычисляет количество бензина необходимого в точке отдаленной от любой другой
//на y км, y- расстояние между двумя точками, p известное количество бензина в
//одной из точек
function Distanse(y:integer;p:integer):integer;
var
Vdost,Vf,reis:integer;
Vway:integer;
begin

//y-расcтояние

Vdost:=0;//количество доставленного бензина в j точку
Vf:=0;//количество израсходованого бензина на доставку
//определяем то что можно доставить за раз
if (bak+2*Konistri)-y*2>=2*Konistri
then vway:=2*konistri
else vway:=(bak+2*Konistri)-y*2;

reis:=(P div Vway)-1;
Vdost:=(reis-1)*Vway;
Vf:=(reis-1)*2*y;

if (p-Vdost)<=(bak+2*Konistri)-y//если количество бензина которое можно увезти
then //за раз больше количества которое осталось доставить тогда
begin
Vdost:=p;
Vf:=Vf+y;//сделать рейс лишь в конечную точку
end
else
begin
vf:=vf+y*2;//сделать рейс "туда и обратно"
Vdost:=Vdost+Vway;//увеличить количество доставленого

if (p-Vdost)<=(bak+2*Konistri)-y//если количество бензина которое можно увезти
then //за раз больше количества которое осталось доставить тогда
begin
Vdost:=p;
Vf:=Vf+y;//сделать рейс лишь в конечную точку
end
else
begin
vf:=vf+y*2;//сделать рейс "туда и обратно"
Vdost:=Vdost+Vway//увеличить количество доставленого
end;
end;

result:=Vf+Vdost;
//то что необходимо иметь в точке Х что бы доехать до отметки 500
end;

//заполнить(находит количество бензина необходимое в точке 0)
procedure fill(var p:tpust);
var i,j,ras,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
for j:=1 to ras do //Выбираем оптимальное расстояние до следующей точки
begin
//кол-во топлива необх чтобы доехать из точки i до конца
if p[i+j].liter>=bak+2*konistri
then ben :=distanse(j,p[i+j].liter)
else ben:=maxint;

if p[i].liter >= ben
then
begin
p[i].next := i+j; //след точка в ко-ю мы можем попасть из i
p[i].liter := ben; //кол-во бензина чтобы доехать до конца
end;
end;
end;
end;//filL
end.

unit umain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,upust, Grids, Buttons, XPMan;

type
TForm1 = class(TForm)
sgmain: TStringGrid;
SpeedButton1: TSpeedButton;
XPManifest1: TXPManifest;
SpeedButton2: TSpeedButton;
procedure bobrClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
p:tpust;

implementation

{$R *.dfm}
//вывод количества бензина на каждом км
procedure TForm1.bobrClick(Sender: TObject);
var i: integer;
begin
fill(p);
sgmain.RowCount:=502;

for i:=1 to S+1 do
begin
sgmain.Cells[0,i]:=inttostr(i-1)+' км';
sgmain.Cells[1,i]:=inttostr(p[i-1].liter)+' л';
sgmain.Cells[2,i]:=inttostr(p[i-1].next)+' км';
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
sgmain.Cells[0,0]:='Текущий км';
sgmain.Cells[1,0]:='Литры до конца';
sgmain.Cells[2,0]:='Следующий км';

for i:=390 downto 0 do
begin
p[i].liter := maxint;
p[i].next:=i;
end;
end;

//вывод лучшего решения
procedure TForm1.BitBtn1Click(Sender: TObject);
var i,nom, j: integer;
begin
fill(p);
nom:= p[0].next;

sgmain.RowCount:= 2;
sgmain.Cells[0, 1]:= inttostr(0)+' км';
sgmain.Cells[1, 1]:= inttostr(p[0].liter)+' л';
sgmain.Cells[2, 1]:= inttostr(p[0].next)+' км';
j:= 2;
for i:= 0 to S do
if i = nom then
begin
sgmain.Cells[0, j]:= inttostr(i)+' км';
sgmain.Cells[1, j]:= inttostr(p[i].liter)+' л';
sgmain.Cells[2, j]:= inttostr(p[i].next)+' км';
nom:= p[i].next;
sgmain.RowCount:= sgmain.RowCount + 1;
j:= j + 1;
end;
end;

end.
__________________
VSU, AMM, Software and administration of information systems
We are the best among the best!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:56.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter