Модуль по турбо паскалю не меняется в файл .tpu, ошибки не выдаёт и при компилировании показывает что программа выполняется правильно.
unit Graf_01;
interface
uses Graph,Crt;
type fun=function(x:real):real; {$F+}
procedure GrafInit;
procedure Tree(a,n:integer; x,y,L,xL,yL:real);
procedure Triangle(xa,ya,xb,yb,xc,yc,n:integer);
procedure Kantor(x,y:integer;size:word);
procedure FGraf(a,b,dx:real; f:fun; maxX,maxY:integer);
implementation
procedure GrafInit;
{ инициализация графического режима }
var gd,gm,ErrorCode:integer;
begin
gd:=Detect; { выбор графического драйвера }
InitGraph(gd, gm, 'c:\case\bp\bgi');
ErrorCode:=GraphResult;
if ErrorCode <> grOk
then begin
writeln('Error_Init:',GraphErrorMsg(ErrorCode)); Halt
end
end;
procedure Tree(a,n:integer; x,y,L,xL,yL:real);
{ построение фрактального дерева }
var r:real;
begin
if (n>0) and (not keypressed)
then begin
SetColor(21-n); { установка цвета линии }
xL:=0.5*(x+xL); yL:=0.5*(y+yL); r:=a*pi/180;
x:=xL+L*cos(r); y:=yL-L*sin(r);
Line(round(x),round(y),round(xL),round(yL)); { рисует отрезок прямой}
Tree(a-30,n-1,x,y,L/2,xL,yL); {рекурсивный вызов}
Tree(a+30,n-1,x,y,L/2,xL,yL);
Tree(a-45,n-1,x,y,L/2,xL,yL);
Tree(a+45,n-1,x,y,L/2,xL,yL);
Tree(a+15,n-1,x,y,L/1.5,xL,yL);
Tree(a+30,n-1,x,y,L/1.5,xL,yL);
end
end;
procedure Triangle(xa,ya,xb,yb,xc,yc,n:integer);
{ построение треугольника Серпинского}
var xp,xq,xr,yp,yq,yr:integer;
begin
if n > 0
then begin
xp:=(xb+xc) div 2; yp:=(yb+yc) div 2;
xq:=(xa+xc) div 2; yq:=(ya+yc) div 2;
xr:=(xb+xa) div 2; yr:=(yb+ya) div 2;
Line(xp,yp,xq,yq); Line(xq,yq,xr,yr); Line(xp,yp,xr,yr);
Triangle(xa,ya,xr,yr,xq,yq,n-1);
Triangle(xb,yb,xp,yp,xr,yr,n-1);
Triangle(xc,yc,xq,yq,xp,yp,n-1);
end
end;
procedure Kantor(x,y:integer;size:word);
{ построение множества Кантора }
var s:word;
procedure SolidRec(x,y,size:integer);
begin
Rectangle(x-size,y-size,x+size,y+size); { рисует прямоугольник}
Bar(x-size+1,y-size+1,x+size-1,y+size-1); {закрашеный квадрат}
end;
begin
if size>1
then begin
s:=size div 2;
Kantor(x-size,y+size,s); Kantor(x-size,y-size,s);
Kantor(x+size,y+size,s);Kantor(x+size,y-size,s);
end;
SolidRec(x,y,size)
end;
procedure FGraf(a,b,dx:real; f:fun; maxX,maxY:integer);
const Ots=10;
procedure MaxMinF(a,b,dx:real;f:fun; var fmin,fmax:real);
var w,x:real; k,n:integer;
begin
fmin:=f(a); fmax:=f(a); n:=trunc((b-a)/dx)+1;
for k:=0 to n do begin
x:=a+k*dx; w:=f(x);
if w < fmin then fmin:=w;
if w > fmax then fmax:=w
end
end;
var fmin,fmax,mx,my,x:real; n,x0,y0,k,xg,yg:integer;
begin
{ определение начала координат }
x0:=maxX div 2; y0:=maxY div 2;
Line(Ots,y0,maxX-Ots,y0); { проведение оси Ox}
Line(x0,Ots,x0,maxY-Ots); { проведение оси Oy}
MaxMinF(a,b,dx,f,fmin,fmax); { вычисление fmin, fmax на отрезке [a,b] }
mx:=(maxX-2*Ots)/(b-a); { масштаб по оси х}
my:=(maxY-2*Ots)/(fmax-fmin); { масштаб по оси y}
MoveTo(x0+trunc(mx*a),y0-trunc(my*f(a))); {установка курсора в начало графика}
n:=trunc((b-a)/dx)+1;
for k:=0 to n do begin
x:=a+k*dx;
xg:=x0+trunc(mx*x); { графические координаты по оси x}
yg:=y0-trunc(my*f(x)); { графические координаты по оси y}
LineTo(xg,yg); { проведение кривой}
end
end;
end.
Можем тупо перебрать эти варианты сборки из исходных данных, и увидеть который даст меньшую сумму перекладок. Можешь сделать это самостоятельно, а мне лень.
Идём дальше, и заметим, что сумма перекладок составляет общую сумму всех предметов во всех баках, за минусом тех, которые изначально уже находятся в своих баках. Эта логика верна для любого из шести начальных вариантов.
А что такое предметы, уже находящиеся в своих баках? Это значит, что для данного из шести вариантов наборов баков имеется только одно число в своей строке таблицы, которое указывает на уже лежащий предмет. Например, если баки назначаем так: стекло, бумага, жесть, то из общей суммы всех предметов задачи нужно вычесть числа 52, 83, 75 - то есть лежащие на главной диагонали таблицы.
Для нахождения решения задачи нам нужно подобрать такую перестановку столбцов заданной таблицы, чтобы сумма чисел, находящихся на главной диагонали была максимальной. При таком варианте общая сумма перекладок предметов будет минимальна.
Руководствуясь этим принципом, нужно найти такую комбинацию выбора трёх чисел из заданной таблицы, чтобы они все три одновременно принадлежали как разным строкам, так и разным столбцам; и при этом сумма выбранных чисел была бы максимальной из всех (а их 6) вариантов выбора.
Мне неохота перебирать все эти комбинации, сделай сам. Но навскидку кажется, что если из первого столбца выберу максимальное число (98), из второго столбца уже выбранную строку (вторую) трогать нельзя, поэтому среди верхнего (58) и нижнего (83) выберу наибольшее, и это 83. Таким образом, вторая и третья строки заняты. Из третьего столбца остаётся, что можно взять только число из первой строки, и это 64.
Сумма 98+83+64 = 245 - это число предметов, которые не нужно перекладывать, они сразу лежат в своих баках.
Общее число предметов в задаче - сумма всех 9 чисел таблцы, у меня получилась 693.
ответом будет число перекладок, равное общему числу предметов, минус которые не надо перекладывать. То есть 693 - 245 = 448.
Думаю что это и есть ответ. Но лучше проверь остальные 5 вариантов назначения баков своим видам мусора, и получишь ещё пять чисел. ответом будет наименьшее из них. Чисто нвскидку мне кажется, что это и будет 448.