last day (15 days later) » 

17:04
-1
Q: Python. Помогите с заданием на площадь

АлександрИтак суть: дано n-ое кол-во заборов с одинаковым расстоянием друг от друга - 1, каждый из которых расположен на одной линии, и разной длиной. Нужно вычислить максимально возможную площадь образованного прямоугольника от заборов. Притом можно не использовать забор полностью, но нельзя его удлинять...

Ничего не понятно.
Знаете какой ответ? Сумма площадей этих прямоугольников. Загадочная постановка задачи таки. "...как можно его улучшить/изменить, чтобы минимизировать использование памяти?..." - что тут улучшать, уменьшать и оптимизировать? Компьютер решит пару миллиардов раз эту задачку раз пока моргнёте.
А что тут по памяти можно оптимизировать? У вас тут память ничего кроме списка прямоугольников (заборов) не использует. Ну и ещё несколько временных переменных, их можно вообще в расчёт не брать. А без списка с данными вы же не можете задачу решать.
@rotabor Да всё понятно. Есть доски шириной 1 и разной длины. Нужно посчитать, какой максимальной площади можно из них забор сделать. Забор должен быть тоже прямоугольный и целиком заполненный, без прогалов.
@CrazyElf То есть дощечки можно ставить друг на друга? Или нужно отпиливать по самой короткой?
@rotabor А, блин, вот это "можно не использовать длину полностью" я не заметил. Хрен знает, что это значит ))
17:04
@CrazyElf Ага, если нужно отпиливать, то нужно решить, сколько отбросить самых коротких, чтобы площать из оставшихся подрезанных была максимальной.
@CrazyElf Скорее участки земли, а не доски. Стоят вплотную к друг другу у прямой дороги. Их длина - заборы. Нужно рассчитать максимально возможный совмещенный из них прямоугольный участок, с условием, что продлевать забор нельзя, а вот укорачивать можно.
@Александр Без рисунка всё-равно ничего непонятно. Нарисуйте хоть в паинте что-то поясняющее )
@FoxFox Для принятия на место работы нужно) Кушает прога на их тесте 3000мб, а им 64 нужно
Подкорректировал вопрос
@Александр А, так задачка простая, теперь понятно, почему такой код. А что касается памяти, ещё раз - на что она уходит то? На список fences? Какого он примерно размера и какой максимальной длины может быть забор? Если память уходит только на хранение fences, я бы просто запихал эти данные в Numpy массив минимального типа который такие числа умеет хранить. Ну или другой вариант, если массив уже где-то хранится и вы имеете к нему доступ с обоих концов, то можно не копировать его, а просто брать элементы с концов и двигаться внутрь, откидывая края, когда они хуже. Ну, примерно.
Кстати, добавьте ещё пример данных в вопрос.
"...Кушает прога на их тесте 3000мб, а им 64 нужно..." - ни о чём. Конкретном. Кроме того, кто Вам сказал, что эта Ваша прога - достижение компьютерной инженерии? Лично я Вам сказал, что в первой Вашей формулировке это просто сумма площадей. Вторая, как я понимаю, формулировка ещё круче. Я не могу понять. Вместо "графиков" неизвестно о чём, лучше б заборы свои нарисовали, чтоб хоть как-то можно было понять на что это похоже. И да, я системщик, я понимаю когда память действительно что-то жрёт и как выяснить что происходит на самом деле.
MBo
MBo
17:04
Проблемы текущего решения не в памяти - там просто хранятся входные данные, а в том, что оно квадратичное от размера массива. Однако можно решить за линейное время, например, с использованием монотонного стека ru.stackoverflow.com/a/1351146/291659. Дубликат не знаю- ставить, или нет, поскольку организация входных данных там чуть другая, но после предобработки получается то же самое
Даны целые числа n_i. Найти максимум по i,j: min(n_i, n_j)*(j - i). Вроде так. Требуется решить быстрее чем за квадрат в линейной памяти.
Решить можно за N. Выделить кандидаты в левые заборы - возрастающая подпоследовательность n_i. Выделить кандидаты в правые заборы - убывающая подпоследовательнность. Бежать по кандидатам двумя указателями. Вроде будет линейная сложность, подвохов не вижу.
@MBo, там задача про максимальный прямоугольник в подграфике функции. Эта задача проще. Там один монотонный стек, тут два. Тут стеки надо слить, там нет.
MBo
MBo
@StanislavVolodarskiy Хм, похоже я действительно невнимательно посмотрел на картинку. Однако она мне непонятна ("нельзя его удлинять" на картинке нарушено?), я интерпретировал задачу так же, как CrazyElf. Хорошо бы увидеть истинное условие.
@MBo, на картинке прямоугольник строится по минимуму высот двух красных палок. Это и есть "нельзя его удлинять": если палки разной высоты, более длинную надо обрезать, надстраивать более короткую нельзя. (Задача интересная, сформулирована безобразно. Я бы на месте нанимателя отказал ТС с формулировкой: неумение поставить задачу).
Я выполнил пример. Отработал мгновенно. Никакой "памяти" никто не ел! Ни 3 Тб, ни 64 Мб. Я уже кое-как разобрался с абсурдностью этих идей, но причём тут память, кто её мерял, как, чем и зачем, я пока понять не могу. Абсолютно стандартная консольная утилитка. Если надо сократить код, наверняка можно, за счёт однострочников типа или анализа необходимости переменных, может map ещё, но это уже совсем другая тема. Ноут у меня 2012 года рождения, так что выполнялось стандартно, без суперкомпьютера.
Кстати, за такой вот input() и обработку введенных данных на работу точно не следует брать.

last day (15 days later) »