1) найдем, во сколько раз N ,больше двух (это будет ориентиром счетчика нашего цикла), т.е. разделим N на 2 и возьмем целую часть. Присвоим ее некой переменной X.
2) наливаем воду в сосуд Nлитров
3) запускаем цикл со счетчиком i: для i от 1 до x начало цикла - переливаем воду из сосуда Nл. в сосуд 2л. - выливаем воду из сосуда 2л. конец цикла
4) Цель задачи достигнута: в сосуде Nл. ровно 1 литр воды.
// PascalABC.NET 3.1, сборка 1198 от 11.03.2016 begin var n:=5; var z:=MatrixRandom(n,n,10,99); for var i:=0 to n-1 do begin for var j:=0 to n-1 do Print(z[i,j]); Writeln end; var imin:=0; var jmin:=n-1; for var i:=1 to n-1 do if z[i,n-i-1]<z[imin,jmin] then begin imin:=i; jmin:=n-i-1 end; Writeln('Zmin=Z[',imin+1,',',jmin+1,']=',z[imin,jmin]) end.
Предлагается хранить типы блоков в массиве. Каждый элемент - 2Б, количество элементов - 2^20 => всего требуется 2МБ.
При перезаписи блока и очередной переоценке необходимо учитывать типы данных в блоке до перезаписи (T0), после перезаписи (T1) и в соседних блоках (TL, TR).
Если T0 = T1, то количество кусков данных не изменяется, т.е. W[i+1] = W[i] TL = T0 = TR <> T1 -> W[i+1] = W[i] + 2 TL = T1 = TR <> T0 -> W[i+1] = W[i] - 2 TL = TR, T0 <> TL, T1 <> TL -> W[i+1] = W[i]
Если все четыре типа не совпадают, то W[i+1] = W[i] Если перезаписывается блок с адресом 0, считать, что тип TL не совпадает ни с одним из трех других.Аналогично при перезаписи блока с адресом , но для TR.
2) наливаем воду в сосуд Nлитров
3) запускаем цикл со счетчиком i:
для i от 1 до x
начало цикла
- переливаем воду из сосуда Nл. в сосуд 2л.
- выливаем воду из сосуда 2л.
конец цикла
4) Цель задачи достигнута: в сосуде Nл. ровно 1 литр воды.