Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++|Pascal] Операции с массивом


Автор: Aliance 12.2.2007, 02:00
Массив модифицировать таким образом что бы суммы элементов в модифицированном массиве располагающихся на равном удалении от начала и конца массива возрастали с удалением пары элементов от концов массива.

Примечания:
• под массивом понимается массив из 50 элементов. Элементы целые, положительные, меньше 26;
• ввод данных осуществляется из файла, файл генерируется отдельной программой с возможностью ввода как случайных элементов, так и с клавиатуры;

Автор: Rodman 12.2.2007, 11:37
Цитата(Aliance @  12.2.2007,  01:00 Найти цитируемый пост)
Массив модифицировать таким образом что бы суммы элементов в модифицированном массиве располагающихся на равном удалении от начала и конца массива возрастали с удалением пары элементов от концов массива.

брррр....

я не совсем пойму...

приведи пример исходного и результата массивов... чтоб я закономерность понял... и немного объяснений не помешает...

Автор: Strannik 12.2.2007, 12:28
Ну что-то вроде такого:

было 1 2 3 4 5 6
стало 1 3 5 6 4  2

1+2>3+4>5+6

Добавлено @ 12:35 
Если можно использовать доп. массив, то вроде просто:

Код

//SORT
l:=0;
r:=n+1;
while i<=n do
 begin
  inc(l);
  dec(r);  
  b[l]:=a[i]
  b[r]:=a[i+1];
  i:=i+2;
 end;

Автор: JAPH 12.2.2007, 12:41
А я сделал так:
Код

var f:text;
    a:array[1..50]of byte;
    i,j,t:byte;
begin
  assign(f, 'opit.dat');
  {$I-} reset(f); {$I+}
  if ioresult<>0 then exit;
  for i:=1 to 50 do readln(f, a[i]);
  close(f);
  for i:=1 to 24 do for j:=i+1 to 25 do if a[i]+a[51-i]>a[j]+a[51-j] then begin
    t:=a[i]; a[i]:=a[j]; a[j]:=t;
    t:=a[51-i]; a[51-i]:=a[51-j]; a[51-j]:=t
  end;
  for i:=1 to 50 do write(a[i]:4);
  readln
end.

Автор: Aliance 12.2.2007, 15:37
Ребят, код написать я бы смог сам впринципе, тут в том-то и главная трудность - понять как сделать это и написать алгоритм. И еще, к сожалению, доп. массив использовать нельзя.
Помогите, если сможете, за мной не заржаваеет smile И еще, я очень не люблю паскаль, если можно пишите комментарии к коду, чтобы я смог понять что где =) Зарание всем огромное спасибо.

Автор: volvo877 12.2.2007, 16:13
Цитата(Aliance @  12.2.2007,  14:37 Найти цитируемый пост)
главная трудность - понять как сделать это и написать алгоритм

smile
1. Упорядочиваем массив по возрастанию/убыванию
2. Массив вида <1, 2, 3, 4, 5, 6, 7, 8> приводим к виду <1, 3, 5, 7, 8, 6, 4, 2>, то есть в первой половине его должны храниться только элементы с нечетными индексами отсортированного массива, упорядоченные по возрастанию, а во второй - только с четными индексами, упорядоченные по убыванию...


Автор: JAPH 12.2.2007, 16:43
Если я правильно понял задачу, то мой алгоритм такой.
Рассматриваем (не создаём, а просто рассматриваем) массив, содержащий суммы элементов нашего массива a, равноудалённых от концов массива:
Код

int b[25];
for (int i = 0; i < 25; i++) b[i] = a[i] + a[49 - i];

Задача модифицирования a выражается в сортировке массива b. Ведь если мы упорядочим элементы b по возрастанию, то мы упорядочим суммы элементов a в требуемом порядке. Сортировка b может быть такой (пузырёк):
Код

for (int i = 0; i < 24; i++) for (int j = i + 1; j < 25; j++) if (b[i] > b[j]) {
  int t = b[j];
  b[j] = b[i];
  b[i] = t;
}

Теперь переложим эту сортировку на a:
Код

for (int i = 0; i < 24; i++) for (int j = i + 1; j < 25; j++)
if (a[i] + a[49 - i] > a[j] + a[49 - j]) {
  int t = a[i]; a[i] = a[j]; a[j] = t; //Перестановка сумм элементов сводится к перестановке соответствующих слагаемых
  t = a[49 - i]; a[49 - i] = a[49 - j]; a[49 - j] = t;
}

Вот и всё. Чей способ проще - не знаю. Если что-то непонятно, уточняем, что конкретно вызывает затруднения, и спрашиваем. smile 

Автор: Strannik 12.2.2007, 21:15
JAPH, Всё это очень неплохо, но только в случае если требуется отсортировать по неубыванию. Если строго по возрастанию - обвалится на банальном тесте: "1 2 3 4 5 6". Твой алгоритм оставит массив без изменений, а это неверно.

П.С. Если я не так понял алгоритм - заранее прошу прощения.

Автор: JAPH 12.2.2007, 22:33
Да, тогда, пожалуй, ваш способ лучше. smile

Автор: Aliance 13.2.2007, 21:07
А вы учли, что чисел может быть нечетное количество? Могут быть все нули, все одинаковые и т.д.
В общем я так и не прочитал словестного алгоритма smile А сам плохо понимаю, как это сделать...

Автор: Dov 15.2.2007, 00:44
Цитата(Aliance @  13.2.2007,  20:07 Найти цитируемый пост)
В общем я так и не прочитал словестного алгоритма  А сам плохо понимаю, как это сделать...

Предлагаю так. Ищем минимальный эл-т, и меняем его местами с крайним левым, увеличивая индекс крайнего левого эл-та, потом опять ищем минимальный эл-т среди оставшихся, и меняем его местами с крайним правым эл-том, уменьшая индекс  крайнего правого эл-та и т.д., пока индексы правого и левого не сравняются. Короче, легче код написать, чем на пальцах показывать.  smile 
Ну, что-нибудь такое, например.
Код

void swap(int& a, int& b)
{
    int tmp;

    tmp = a;
    a   = b; 
    b   = tmp;
}  

int main()
{
    int  ar[] = {2, 2, 1, 3, 3, 3, 5, 3, 8, 4};
    int  size = sizeof(ar) / sizeof(int);
    int  min,
         ind,
         beg = 0,
         end = size - 1;    

    for(int i = 0; i < size; i++)
        cout << ar[i] << ' ';
    cout << endl;

    for(bool b = true; beg < end; b = !b)
    {
        min = ar[beg];
        ind = beg;
        for(i = beg + 1; i <= end; i++)
        {
            if(ar[i] < min)
            {
                min = ar[i];
                ind = i;
            }
        }

        swap(ar[b ? beg++ : end--], ar[ind]);        
    }

    for(i = 0; i < size; i++)
        cout << ar[i] << ' ';
    cout << endl;
    
    return 0;
}
  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)