Peer-2-Peer
Мудрец
(16172)
5 лет назад
КАРДИНАЛЬНОЕ ПРЕДЛОЖЕНИЕ.
Поскольку само понятие «номер элемента» является явно заданным в формулировке вопроса, то предлагаю объединить понятия «элемент списка» и «номер элемента» в одной ячейке. Также можно не связывать индекс массива с собственным номером элемента, но использовать как инструмент.
Пожалуйста, Nate Diaz, прошу Вас ответить, проходили ли Вы ключевое слово „Record” и понятие типа-записи?
Через запись можно записать обособление номера вместе с соответствующим элементом, например, так:
Type UNITinList = record
Number,Value:integer // поле Value для значения элемента, поле Number для его номера
end;
var VList:array[0..MaxInt] of UNITinList;
// пример: VList[i].Number:=i; VList[i].Value:=Random(MaxInt);
✓ Вариант без Record:
Type UNITSet = [Number,Value]; // определение пользовательских констант внутри типа. Каждая из констант имеет тип UNITSet
var VList:array [0..MaxInt,UNITSet] of integer;
// пример обращения к элементу списка: VList[i,Number]:=i; VList[i,Value]:=Random(MaxInt);
›⟩ ОБОСОБЛЕНИЕ номера элемента вместе со значением соответствующего элемента позволит сохранить присвоенный номер НЕЗАВИСИМО от вставок/удалений элементов!!!
Peer-2-PeerМудрец (16172)
5 лет назад
Инициализировать массив удобно случайными числами. Например:
var i:integer;
· · ·
Randomize;
for i:=0 to MaxInt do
begin
VList[i,Number]:=i; VList[i,Value]:=Random(MaxInt)
end;
Peer-2-PeerМудрец (16172)
5 лет назад
* Удаление элементов списка лучше реализовать условно, как пометку. Например, присваивать номеру удаляемого элемента отрицательное значение.
* Для значений единиц элементов можно объявить отдельный массив типа ShortInt. Дело в том, что | Z mod 10 | < 10 по определению понятия остатка числа.
• Далее реализовать сведение двух массивов в один. Это окончательно убедило меня в том, что лучше использовать динамические массивы. Pascal ABC их поддерживает.
Peer-2-PeerМудрец (16172)
5 лет назад
Ну а поиск минимального в массиве результатов — простая рутина.
Пусть ResList — динамический массив результатов типа Integer. Переменная ListBottom типа Integer — индекс минимального в массиве.
ListBottom:=0;
for i:=1 to Length(ResList)-1 do
if ResList[i] < ResList[ListBottom] then ListBottom:=i;
Peer-2-PeerМудрец (16172)
5 лет назад
Re: КАРДИНАЛЬНОЕ ПРЕДЛОЖЕНИЕ
Объявление исходного массива как динамического:
var VList:array of UNITinList;
либо
var VList:array of array [UNITSet] of Integer;
Peer-2-PeerМудрец (16172)
5 лет назад
* * * ОСНОВНОЙ ПРОЦЕСС * * *
var j,Actual:Integer=0;
···
// удаление элементов
For i:=0 to ListLen-1 do
if VList[i,Number] = VList[i,Value] then VList[i,Number]:=-1
else Inc(Actual,2);
// далее создаётся массив результатов
SetLength(ResList,Actual);
// копирование из исходного массива в конечный и добавление числа единиц
j:=0;
for i:=0 to ListLen-1 do
begin
if VList[i,Number] = -1) do Continue;
ResList[j]:=VList[i,Value];
ResList[j+1]:=VList[i,Value] mod 10;
Inc(j,2)
end;
его единиц, нахождение минимума из оставшихся элементов списка.