Array124. Дано целое число $$K (\gt 0)$$ и целочисленный массив размера $$N$$. Поменять местами последнюю серию массива и его серию с номером $$K$$. Если серий в массиве меньше $$K$$, то вывести массив без изменений.
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
program Array124; var a,b : array [1..20] of real; N,K,ki,i,i2,i3,kbegin,kend,klast: integer; addSeries:boolean; begin //вводим значения из задания Write('N: '); Readln(N); Write('K: '); Readln(K); Writeln('A: '); for i:=1 to N do begin write(i,' :'); readln(a[i]); end; // анализируем массив ki:=0; kbegin:=1; for i:=1 to N do if i<>N then if a[i]<>a[i+1] then begin inc(ki); klast:=i+1; //всегда находя новую серию говорим что первый элемент принадлежит последней серии, в конце цикла здесь окажется действительно первый элемент последней серии. if ki+1=k then kbegin:=i+1; //находим первый элемент из серии k if ki=k then kend:=i; //находим последний элемент из серии k end; i:=0; i2:=0; //cобираем массив while i<N do begin inc(i); // если элемент не является началом не k серии, не первым элементом последней серии if (i<>kbegin) and (i<>klast) then begin inc(i2); b[i2]:=a[i]; //добавляем его в конец массива b end; if i=kbegin then //если массив является первым элементом k серии begin for i3:=klast to N do //добавляем последнюю серию в массив b begin inc(i2); b[i2]:=a[i3]; end; i:=kend; //и переносим счётчик в начало следующей серии end; if i=klast then // если текущий элемент является началом последней серии begin for i3:=kbegin to kend do //добавляем k серию в массив b begin inc(i2); b[i2]:=a[i3]; end; i:=N; //переносим счётчик в конец массива, что бы закрылся цикл. end; end; a:=b; for i:=1 to i2 do writeln(a[i]); //выводим полученный массив. end. |
Задачи из раздела Array можно посмотреть здесь.
Хотел было выложить код со вставками и сдвигами… Но что-то надоело высчитывание индексов (и подгон в отладчике). Да и код трудно читаемый. Рилли это не комфортное программирование. Я тут подумал, а не спроста таки в задаче Array116 были даны два дополнительных массива: один по длинам серий, другой — по элементам этих серий. Понятия не имею, насколько это эффективно вводить во всех заданиях этой группы два доп. массива, но, сдается мне, все эти задачи решаются таким методом весьма наглядно и непринужденно. Например, код для задач 123 и 124 будет отличаться в одной строчке. Алгоритм тут такой. Сначала, как в задаче 116, раскладываем массив в два доп. массива B и C по длинам и элементам серий. Затем производим обмен нужных нам серий в этих двух массивах (можно вообще любые серии менять). И, наконец, из этих измененных массивов собираем результирующий массив.