Вопрос, который вызвал трудности
Задан массив, состоящий из чисел 1, 2, 3. За одну операцию можно поменять местами два любых числа. Вам необходимо за минимальное
Ответ экспертов Учись.Ru
Чтобы дать полноценный ответ, был привлечён специалист, который хорошо разбирается в теме.
После обсуждения с другими специалистами сервиса мы пришли к выводу, что правильный ответ на ваш вопрос будет звучать следующим образом:
var
a : array [1..1000] of longint;
b : array [1..3] of longint;
i,n,k : longint;
procedure Swap(x,y,z:longint);
var
i,j,t : longint;
begin
i:=1;
j:=n;
while (i<=n) and (j>=1) and (i<j) and (i<=z) do
begin
while (i<=n) and (a[i]<>x) do inc(i);
while (j>=1) and (a[j]<>y) do dec(j);
if (i<j) and (i<=z)
then begin
t:=a[i]; a[i]:=a[j]; a[j]:=t;
inc(i); dec(j);
inc(k);
end;
end;
end;
begin
readln(n);
for i:=1 to 3 do b[i]:=0;
for i:=1 to n do
begin
read(a[i]);
inc(b[a[i]]);
end;
Swap(3,1,b[1]);
Swap(2,1,b[1]);
Swap(3,2,b[1]+b[2]);
writeln(k);
end.
a : array [1..1000] of longint;
b : array [1..3] of longint;
i,n,k : longint;
procedure Swap(x,y,z:longint);
var
i,j,t : longint;
begin
i:=1;
j:=n;
while (i<=n) and (j>=1) and (i<j) and (i<=z) do
begin
while (i<=n) and (a[i]<>x) do inc(i);
while (j>=1) and (a[j]<>y) do dec(j);
if (i<j) and (i<=z)
then begin
t:=a[i]; a[i]:=a[j]; a[j]:=t;
inc(i); dec(j);
inc(k);
end;
end;
end;
begin
readln(n);
for i:=1 to 3 do b[i]:=0;
for i:=1 to n do
begin
read(a[i]);
inc(b[a[i]]);
end;
Swap(3,1,b[1]);
Swap(2,1,b[1]);
Swap(3,2,b[1]+b[2]);
writeln(k);
end.