Осталось мало ! 15 ! нужно ускорить работу программы по нахождению количества различных элементов в массиве. массив достигает до 100 000 элементов, а сами элементы до 2 000 000 000. код написан снизу. можно что-то добавить или изменить, можно вообще другой код написать. 15 чистых . язык паскаль (free pascal compiler 3.0.0). надеюсь на вашу var a, b: array [1..100000] of int64; i, n, c, j: longint; tratata, d: boolean; begin readln(n); for i : = 1 to n do begin read(a[i]); if a[i] = 0 then tratata : = true; d : = false; for j : = 1 to n do if a[i] = b[j] then d : = true; if not d then begin inc(c); b[c] : = a[i]; end; end; if tratata then writeln(c + 1) else writeln(c); end.
156
266
Ответы на вопрос:
Из небольших ускорений можно предложить проверять до 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.
Реши свою проблему, спроси otvet5GPT
-
Быстро
Мгновенный ответ на твой вопрос -
Точно
Бот обладает знаниями во всех сферах -
Бесплатно
Задай вопрос и получи ответ бесплатно
Популярно: Информатика
-
Ksuhan1317.10.2022 10:14
-
lolipop172027.03.2023 05:26
-
taniash05200506.09.2021 11:28
-
chery1031.12.2020 13:42
-
хорошистка25621.12.2021 11:54
-
saule1961122508.06.2020 02:05
-
katuwka2003200312.11.2021 07:12
-
dimallow13.05.2020 09:40
-
ZVer0071116.06.2023 00:10
-
Zulem20.11.2021 23:49
Есть вопросы?
-
Как otvet5GPT работает?
otvet5GPT использует большую языковую модель вместе с базой данных GPT для обеспечения высококачественных образовательных результатов. otvet5GPT действует как доступный академический ресурс вне класса. -
Сколько это стоит?
Проект находиться на стадии тестирования и все услуги бесплатны. -
Могу ли я использовать otvet5GPT в школе?
Конечно! Нейросеть может помочь вам делать конспекты лекций, придумывать идеи в классе и многое другое! -
В чем отличия от ChatGPT?
otvet5GPT черпает академические источники из собственной базы данных и предназначен специально для студентов. otvet5GPT также адаптируется к вашему стилю письма, предоставляя ряд образовательных инструментов, предназначенных для улучшения обучения.