|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
Результаты опроса: На ваш взгляд это сложная задача? | |||
Очень сложная | 0 | 0% | |
Сложная | 3 | 75.00% | |
Простая | 0 | 0% | |
Очень простая | 1 | 25.00% | |
Голосовавшие: 4. Вы еще не голосовали в этом опросе |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
Решение
найдено верное решение
//Имеется пустыня длиной 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! |