Предлагается хранить типы блоков в массиве. Каждый элемент - 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.
uses Crt; const n=50; type Vec=array [1..n] of integer; var A: Vec; i, Sum, Col: integer; begin ClrScr; Randomize; Sum:=0; Col:=0; for i:=1 to n do begin A[i]:=10+random(40); Write(A[i]: 4); if (i mod 10 =0 ) then WriteLn; if (A[i] mod 7 = 1) or (A[i] mod 7 = 2) or (A[i] mod 7 = 5 ) then begin Sum:=Sum+A[i]; Col:=Col+1; end; end; WriteLn; WriteLn (' Sum = ', Sum); WriteLn (' Col = ', Col); ReadLn; end.
При перезаписи блока и очередной переоценке необходимо учитывать типы данных в блоке до перезаписи (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]
Далее рассмотрим случаи, когда TL <> TR
(TL = T0, TR = T1) или (TR = T0, TL = T1) -> W[i+1] = W[i]
(TL = T0, TR <> T1) или (TR = T0, TL <> T1) -> W[i+1] = W[i] + 1
(TL = T1, TR <> T0) или (TR = T1, TL <> T0) - > W[i+1] = W[i] - 1
Если все четыре типа не совпадают, то W[i+1] = W[i]
Если перезаписывается блок с адресом 0, считать, что тип TL не совпадает ни с одним из трех других.Аналогично при перезаписи блока с адресом , но для TR.
Вроде все?
uses Crt;
const n=50;
type Vec=array [1..n] of integer;
var A: Vec;
i, Sum, Col: integer;
begin
ClrScr;
Randomize;
Sum:=0;
Col:=0;
for i:=1 to n do
begin
A[i]:=10+random(40);
Write(A[i]: 4);
if (i mod 10 =0 ) then WriteLn;
if (A[i] mod 7 = 1) or (A[i] mod 7 = 2) or (A[i] mod 7 = 5 ) then
begin
Sum:=Sum+A[i];
Col:=Col+1;
end;
end;
WriteLn;
WriteLn (' Sum = ', Sum);
WriteLn (' Col = ', Col);
ReadLn;
end.