Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2016, 20:40   #1
nobody_nohead
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 22
По умолчанию Задача на перебор Turbo Pascal

Доброго времени суток.
Столкнулся с проблемой в решении вот такой задачки:
Из файла поступает целочисленная последовательность в которой первое число(n) - количество чисел в последовательности, а остальные - сама последовательность. Необходимо в выходной файл поместить число, которое будет содержать максимальный результат при вставке между числами последовательности 2 операций умножения и n-3 операций сложения.
Суть проблемы:
Пробовал реализовать сначала с обычным массивом - тупняк, не понимаю как после умножения склеить два индекса массива и потом сдвинуть все это на единичку влево. В голову пришла идея реализации с динамическим односвязным списком - опять тупняк. Синтаксис всей программы можете не описывать, помогите пожалуйста именно с этим моментом умножения.
Заранее спасибо!
nobody_nohead вне форума Ответить с цитированием
Старый 30.11.2016, 21:01   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

2-а умножения - это последовательность поделена на три группы, скажем А, В, С. А+В+С = М - сумма всех элементов последовательности.
Произведение А*В*С ,будет максимальным, если эти суммы будут равны.
Просматриваем последовательность с головы и хвоста и формируем три суммы - А, С и В=М-(А+С).
Сумма каждой последовательности должна быть близкой к М/3 (не больше).
Возможно, что потребуется уточняющая операция...

Цитата:
... не понимаю как после умножения склеить два индекса массива и потом сдвинуть все это на единичку влево ...
А это о чем?


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 30.11.2016, 21:09   #3
nobody_nohead
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 22
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
А это о чем?
По моей изначальной задумке был счетчик умножений, и когда в результате перебора находилось два таких элемента массива с индексами i и i+1, что результат их умножения больше, чем этот счетчик - ему присваивалось значение i*i+1. Ну и я хотел 2 раза обойти цикл по такому алгоритму а потом просто в цикле for сложить все элементы массива. Но т.к в pascal нету динамических массивов - я встал в ступор.

К тому же сначала идут операции умножения, и только потом сложения. Поэтому вариант с разделением массива на 3 части не катит ((.

Последний раз редактировалось nobody_nohead; 30.11.2016 в 21:12.
nobody_nohead вне форума Ответить с цитированием
Старый 30.11.2016, 21:36   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Условие, выложенное вами:
Цитата:
Из файла поступает целочисленная последовательность в которой первое число(n) - количество чисел в последовательности, а остальные - сама последовательность. Необходимо в выходной файл поместить число, которое будет содержать максимальный результат при вставке между числами последовательности 2 операций умножения и n-3 операций сложения.
Вывод сделанный вами:
Цитата:
К тому же сначала идут операции умножения, и только потом сложения. Поэтому вариант с разделением массива на 3 части не катит ((.
Ткните, на какой части задания основан ваш вывод?

Как-то так, ...
PS:
Цитата:
... ему присваивалось значение i*i+1.
Так думаю, что это mas[i]*mas[i+1]
Как-то так, ...

Последний раз редактировалось ViktorR; 30.11.2016 в 21:40.
ViktorR вне форума Ответить с цитированием
Старый 30.11.2016, 21:42   #5
nobody_nohead
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 22
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Условие, выложенное вами:

Так думаю, что это mas[i]*mas[i+1]
Да, именно это я и имел ввиду. Просто ввиду моего варианта решения, сами элементы массива не изменяются, поэтому далее в цикле сложения будут участвовать начальные элементы, а не перемноженные между собой. В голову приходили варианты с созданием еще одного массива, и присваиванием ему уже измененных элементов, или же полное переприсваивание элементов исходного массива, но считаю эти решения нерациональными.

Последний раз редактировалось nobody_nohead; 30.11.2016 в 21:51.
nobody_nohead вне форума Ответить с цитированием
Старый 30.11.2016, 21:54   #6
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Ответьте на мой основной вопрос:
Ткните, на какой части задания основан ваш вывод?
Цитата:
К тому же сначала идут операции умножения, ...
Условие задачи, так как оно исходно сформулировано вами (возможно скопипастено вами), предполагает, что массив делится на три группы операциями умножения. И не больше того.


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 30.11.2016, 21:59   #7
nobody_nohead
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 22
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Ответьте на мой основной вопрос:
Ткните, на какой части задания основан ваш вывод?
Само условие задачи пересформулировано мной (видимо не очень удачно). Оригинальное условие слишком длинное. Вывод основан на том, что у меня есть пример. Чтобы все было нагляднее и понятнее: Файл input содержит такую последовательность - 5
4
7
1
5
3
Программа должна найти решение с максимальном выводом, в данном случае это:
4*7+1+5*3, и вывести в файл output результат: 44
nobody_nohead вне форума Ответить с цитированием
Старый 30.11.2016, 22:22   #8
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

А вариант mas[i]*mas[i+1]*mas[i+2] возможен?

Если нет, то:
Просматриваем массив и ищем произведения двух соседей на максимум.
Первый шаг: инициируем переменную max1 := mas[1]*mas[2]; max1i := 1;
инициируем переменную max2 := mas[3]*mas[4]; max2i := 3;
Второй шаг: в цикле формируем max3 := mas[i]*mas[i+1]; max3i := i;
Третий шаг: выполняем сортировку трех чисел - примеров на этом форуме полно.
По завершении находим max1i и max2i.
Далее формируем результат.

PS: В свете примера перечитал условие. Вы правы, в условии нет речи о группировке.

Как-то так, ..
Как-то так, ...

Последний раз редактировалось ViktorR; 30.11.2016 в 22:25.
ViktorR вне форума Ответить с цитированием
Старый 30.11.2016, 22:28   #9
nobody_nohead
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 22
По умолчанию

Хорошо, попробую сделать по вашему способу. Во-всяком случае спасибо!
nobody_nohead вне форума Ответить с цитированием
Старый 01.12.2016, 02:10   #10
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

Ограничения на входные данные какие?
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача turbo pascal на тему: файлы с произвольным доступом в Pascal ExCiTeC Паскаль, Turbo Pascal, PascalABC.NET 0 28.01.2013 20:36
Turbo Pascal задача Инокентий09 Паскаль, Turbo Pascal, PascalABC.NET 1 02.06.2012 11:36
Задача в Turbo Pascal Cooltik Паскаль, Turbo Pascal, PascalABC.NET 10 28.04.2012 19:24
Задача на Turbo Pascal spezzA Фриланс 3 06.04.2011 23:13