Pascal напишите программу введите с клавиатуры три числа и выведите только те из них, которые превышают их среднее арифметическое, причём жёлтым(14) цветом чётные, а зелёным(2) нечётные значения?
//обьявляем дополнительные переменные и главный массив, а также два дополнительных - они будут "половинками". var a, b, c: array [1..100] of longint; i, min, n, j, t: longint; begin //читаем количество элементов в нашем массиве. readln(n); //читаем массив. for i : = 1 to n do read(a[i]); //заполняем первую "половинку". for i : = 1 to n div 2 do b[i] : = a[i]; //заполняем вторую "половинку". но раз это уже вторая "половинка" главного массива, то и //цикл теперь должен начинаться со второй части массива, а заканчиваться уже в его конце. for i : = n div 2 + 1 to n do c[i - n div 2] : = a[i]; //теперь отсортируем первую "половинку" методом выбора. идея этого метода //основывается на том, что мы ищем минимальный среди неотсортированных элемент, //а затем просто swap-аем его с тем, который стоит сразу после отсортированных. for i : = 1 to (n - 1) div 2 do begin min : = i; for j : = i + 1 to n div 2 do if b[min] > b[j] then min : = j; if min < > i then begin t : = b[i]; b[i] : = b[min]; b[min] : = t; end; end; //затем вторую точно также, только стоит обратить внимание на сравнения. //так как надо отсортировать по убыванию, то теперь сравнение перед "swap"-ом //будет другим. for i : = 1 to (n - 1) div 2 do begin min : = i; for j : = i + 1 to n div 2 do if c[min] < c[j] then min : = j; if min < > i then begin t : = c[i]; c[i] : = c[min]; c[min] : = t; end; end; //а теперь просто по очереди выводим готовые "половинки", не забывая ставить //пробел после вывода каждого элемента. for i : = 1 to n div 2 do write(b[i], ' '); for i : = 1 to n - n div 2 do write(c[i], ' '); end.
Khlistova1488
24.03.2022
Из небольших ускорений можно предложить проверять до 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.
Ответить на вопрос
Поделитесь своими знаниями, ответьте на вопрос:
Pascal напишите программу введите с клавиатуры три числа и выведите только те из них, которые превышают их среднее арифметическое, причём жёлтым(14) цветом чётные, а зелёным(2) нечётные значения?