Есть ответ 👍

Информационный объем текста, составленного с алфавита мощностью 64, равен 1097 кб. каков информационный вес символа этого алфавита и сколько содержит этот текст? ¿ решить,

153
161
Посмотреть ответы 1

Ответы на вопрос:


Из небольших ускорений можно предложить проверять до b[c], дальше всё равно ничего нет. но всё равно алгоритм будет делать порядка n^2 операций, что при n = 10^5 достаточно много. кстати, 2*10^9 еще помещается в longint, int64 не нужен. можно пойти другим путём. отсортируем массив a[i] за n log n, а потом для того, чтобы определить уникальные элементы, достаточно одного прохода по массиву. я буду сортировать сортировкой слиянием, вы можете использовать любую другую достаточно быструю сортировку. procedure merge(var a: array of longint; left1, right1, left2, right2: integer); var   temp: array of longint;   i, j, k: integer;   begin   setlength(temp, right1 - left1 + right2 - left2 + 2);   i : = left1;   j : = left2;   k : = 0;   while (i < = right1) and (j < = right2) do   begin     if a[i] < = a[j] then     begin       temp[k] : = a[i];       inc(i);     end else begin       temp[k] : = a[j];       inc(j);     end;     inc(k);   end;   while i < = right1 do   begin     temp[k] : = a[i];     inc(k);     inc(i);   end;   while j < = right2 do   begin     temp[k] : = a[j];     inc(k);     inc(j);   end;   for i : = left1 to right1 do     a[i] : = temp[i - left1];   for j : = left2 to right2 do     a[j] : = temp[j - left2 + right1 - left1 + 1]; end;   procedure mergesort(var a: array of longint; left, right: integer); var   t: longint;   begin   if right - left = 0 then exit;   if right - left = 1 then   begin     if a[left] > a[right] then     begin       t : = a[left];       a[left] : = a[right];       a[right] : = t;     end;     exit;   end;   mergesort(a, left, (left + right) div 2);   mergesort(a, (left + right) div 2 +   1, right);   merge(a, left, (left + right) div 2, (left + right) div 2 + 1, right); end;   var   a: array of longint;   i, n, count: integer;   begin   read(n);   setlength(a, n);   for i : = 0 to n - 1 do     read(a[i]);   mergesort(a, 0, n - 1);   count : = 1;   for i : = 1 to n - 1 do     if a[i] < > a[i - 1] then       inc(count);   writeln(count); end.

Популярно: Информатика