![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 04.10.2015
Сообщений: 1
|
![]()
Не проходит половину тестов из-за превышения по времени. Как оптимизировать работу в такой элементарной программе?
Условие задачи: Для проведения чемпионата Европы по футболу в Португалии было принято решение построить К-цветной цифровой экран NxM (N по вертикали, M по горизонтали) пикселей. Но в связи с тем, что экран очень большой, работать можно только с прямоугольной областью экрана N1xM1 (N1 по вертикали, M1 по горизонтали) пикселей. Экран был сконструирован так, что при его включении цвета пикселям предоставляются случайным образом, а нужно, чтобы все пиксели были черного (0-го) цвета. Вам необходимо определить минимальное количество операций, необходимую для того, чтобы сделать из исходного экрана экран черного (0-го) цвета, или указать, что решения не существует. За одну операцию считается: взять прямоугольную область экрана N1xM1 (N1 по вертикали, M1 по горизонтали) пикселей, полностью принадлежит экрана, и все номера цветов этой области увеличить на единицу по модулю K (т.е. если номер цвета равна K-1, то после увеличение станет 0). С консоли вводятся: в первой строке два числа через пробел N и M - размеры экрана; во второй строке - два числа N1 и M1 - размеры прямоугольной области, в третьей строке - одно число K- количество цветов на экране. Далее следуют строк N по M чисел, разделенные пробелами, - номере цветов в палитре (все числа от 1 до K). Ограничения 1≤N1≤N≤1000, 1≤M1≤M≤1000, 2≤K≤1000. В консоль вывести минимальное количество операций. Мое решение: Код:
|
![]() |
![]() |
![]() |
#2 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
![]()
ну, например
Код:
Код:
прочитал условие задачи. что-то подсказывает, что предложенное решение - решение влоб, и быстрым никогда не будет. принимая во внимание, что состояние пикселей можно прочитать, возможно имеет смыл перед началом операций провести анализ экрана на наличие областей однго цвета. также подумалось, что для ответа на вопрос о существовании решения проводить перестройку экрана не нужно. Последний раз редактировалось f.hump; 04.10.2015 в 15:08. Причина: передумал |
![]() |
![]() |
![]() |
#3 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,429
|
![]()
Согласен с f.hump, что это решение в лоб.
Если ускорять именно это решение, то заменил бы while(arr[j][i]!=0) на расчет сразу необходимого числа шагов для пикселя arr[j][i] и потом уже делал upgrade и увеличивал counter на это число шагов. Насчет текущей проверки impossible не согласен - по-моему, может быть ситуация, что крайние строка и столбец нулевые, а "кое-какие" элементы все же нет. После "полного" апгрейда (зануление левого верхнего угла экрана) ненулевые пиксели могут остаться в M1-1 крайних столбцах и N1-1 крайних строках.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись
![]() Последний раз редактировалось BDA; 04.10.2015 в 15:58. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
как ускорить | AlexVI | Общие вопросы C/C++ | 10 | 15.07.2014 23:42 |
Ускорить процесс | Victor1963 | Помощь студентам | 0 | 15.11.2011 12:06 |
Ускорить процесс. | Victor1963 | Общие вопросы Delphi | 3 | 23.06.2011 21:51 |
Ускорить работу с БД | Poltev86 | БД в Delphi | 2 | 25.05.2010 09:46 |
Как ускорить программу ? | juan666777 | Общие вопросы Delphi | 2 | 02.05.2009 19:48 |