Староческуль-Станиславовна
?>

Во время проведения олимпиады каждый из участников получил свой идентификационный номер – натуральное число. необходимо отсортировать список участников олимпиады по количеству набранных ими . входные данные на первой строке дано число n (1 ≤ n ≤ 1000) – количество участников. на каждой следующей строке даны идентификационный номер и набранное число соответствующего участника. все числа во входном файле не превышают 105. выходные данные в выходной файл выведите исходный список в порядке убывания . если у некоторых участников одинаковые , то их между собой нужно упорядочить в порядке возрастания идентификационного номера. примеры входные данные 3 101 80 305 90 200 14 выходные данные 305 90 101 80 200 14 входные данные 3 20 80 30 90 25 90 выходные данные 25 90 30 90 20 80

Информатика

Ответы

mansur071199486
//обьявляем дополнительные переменные и главный массив, а также два дополнительных - они будут "половинками". 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.
Nataliyaof
Из небольших ускорений можно предложить проверять до 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.

Ответить на вопрос

Поделитесь своими знаниями, ответьте на вопрос:

Во время проведения олимпиады каждый из участников получил свой идентификационный номер – натуральное число. необходимо отсортировать список участников олимпиады по количеству набранных ими . входные данные на первой строке дано число n (1 ≤ n ≤ 1000) – количество участников. на каждой следующей строке даны идентификационный номер и набранное число соответствующего участника. все числа во входном файле не превышают 105. выходные данные в выходной файл выведите исходный список в порядке убывания . если у некоторых участников одинаковые , то их между собой нужно упорядочить в порядке возрастания идентификационного номера. примеры входные данные 3 101 80 305 90 200 14 выходные данные 305 90 101 80 200 14 входные данные 3 20 80 30 90 25 90 выходные данные 25 90 30 90 20 80
Ваше имя (никнейм)*
Email*
Комментарий*