Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++|Pascal] Операции с массивом 
:(
    Опции темы
Aliance
Дата 12.2.2007, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



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

Примечания:
• под массивом понимается массив из 50 элементов. Элементы целые, положительные, меньше 26;
• ввод данных осуществляется из файла, файл генерируется отдельной программой с возможностью ввода как случайных элементов, так и с клавиатуры;
PM MAIL WWW ICQ Skype   Вверх
Rodman
Дата 12.2.2007, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 26
Всего: 122



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

брррр....

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

приведи пример исходного и результата массивов... чтоб я закономерность понял... и немного объяснений не помешает...
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Strannik
Дата 12.2.2007, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 25.1.2007

Репутация: 1
Всего: 2



Ну что-то вроде такого:

было 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;

PM MAIL   Вверх
JAPH
Дата 12.2.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 12
Всего: 23



А я сделал так:
Код

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.


Это сообщение отредактировал(а) JAPH - 12.2.2007, 12:42


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
Aliance
Дата 12.2.2007, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



Ребят, код написать я бы смог сам впринципе, тут в том-то и главная трудность - понять как сделать это и написать алгоритм. И еще, к сожалению, доп. массив использовать нельзя.
Помогите, если сможете, за мной не заржаваеет smile И еще, я очень не люблю паскаль, если можно пишите комментарии к коду, чтобы я смог понять что где =) Зарание всем огромное спасибо.
PM MAIL WWW ICQ Skype   Вверх
volvo877
Дата 12.2.2007, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 34
Всего: 116



Цитата(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>, то есть в первой половине его должны храниться только элементы с нечетными индексами отсортированного массива, упорядоченные по возрастанию, а во второй - только с четными индексами, упорядоченные по убыванию...



Это сообщение отредактировал(а) volvo877 - 12.2.2007, 16:16
PM MAIL   Вверх
JAPH
Дата 12.2.2007, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 12
Всего: 23



Если я правильно понял задачу, то мой алгоритм такой.
Рассматриваем (не создаём, а просто рассматриваем) массив, содержащий суммы элементов нашего массива 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 


Это сообщение отредактировал(а) JAPH - 12.2.2007, 17:07


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
Strannik
Дата 12.2.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 25.1.2007

Репутация: 1
Всего: 2



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

П.С. Если я не так понял алгоритм - заранее прошу прощения.
PM MAIL   Вверх
JAPH
Дата 12.2.2007, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 12
Всего: 23



Да, тогда, пожалуй, ваш способ лучше. smile

Это сообщение отредактировал(а) JAPH - 12.2.2007, 22:34


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
Aliance
Дата 13.2.2007, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



А вы учли, что чисел может быть нечетное количество? Могут быть все нули, все одинаковые и т.д.
В общем я так и не прочитал словестного алгоритма smile А сам плохо понимаю, как это сделать...
PM MAIL WWW ICQ Skype   Вверх
Dov
Дата 15.2.2007, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Цитата(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;
}
  



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0598 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.