2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Олимпиадная задачка.
Сообщение19.02.2012, 18:08 
Заморожен


10/10/11
109
Дана числовая последовательность из N (1<N<1000) элементов A (1<A<1000000). Известно, что в ней есть доминирующий элемент (т.е. значение, которому равны больше чем половина элементов последовательности). Нужно найти это значение за минимальное время(линейное) за один проход последовательности.
Например(В первой строке натуральное число N, а во второй последовательность из N):
Входные данные:
4
2 4 2 2
Выходные:
2

Смог сделать только при A<10, а вот при большом A не знаю.

 Профиль  
                  
 
 Re: Олимпиадная задачка.
Сообщение19.02.2012, 18:16 
Заслуженный участник


11/05/08
32166
Ну если нет ограничения на память, то всё банально. Создаём массив из миллиона счётчиков, инициализируем его нулями и потом на каждом шаге проверяем, не превысило ли значение счётчика для вновь поступившего числа значения того счётчика, который перед этим считался максимальным.

 Профиль  
                  
 
 Re: Олимпиадная задачка.
Сообщение19.02.2012, 20:02 


24/05/09

2054
Проверяем, не превысило ли значение счётчика половину N - это и будет доминирующий элемент. Дальше можно не считать.

 Профиль  
                  
 
 Re: Олимпиадная задачка.
Сообщение19.02.2012, 20:39 


26/01/10
959
Если немного порассуждать, то придумаете алгоритм, требующий дополнительной памяти на стек из N элементов. Размеры самих чисел A при этом не играют роли. Вам нужно придумать, как при проходе по массиву с помощью стека добиться того, чтобы в конце там остался как раз доминирующий элемент. Как бы рассказывать полную идею тут нельзя...

 Профиль  
                  
 
 Re: Олимпиадная задачка.
Сообщение19.02.2012, 20:52 
Заморожен


10/10/11
109
Спасибо. Я программирование увлёкся только пару месяцев назад вдабавок к математике, поэтому, если можно, покажите реализацию на языке программирования самого простого варианта решения.

 Профиль  
                  
 
 Re: Олимпиадная задачка.
Сообщение20.02.2012, 19:40 
Заморожен


10/10/11
109
Может покажет кто хоть часть кода, где реализован простейший(!) алгоритм для этой задачи? Интересует тот момент, когда последовательность задана и программа начала проход. Не знаю, как записывать такое огромное кол-во элементов для последующего сравнения.

 Профиль  
                  
 
 Re: Олимпиадная задачка.
Сообщение20.02.2012, 20:17 


26/01/10
959
Тов. ZARATUSTRA, если у Вас такие сложности с программированием, то я бы советовал начать его изучение с более простых задач. То, о чем Вы спрашиваете, описывается в литературе для школьников. А здесь учебные программы за Вас пишут только при добром расположении духа, да и то это не совсем по правилам.

 Профиль  
                  
 
 Re: Олимпиадная задачка.
Сообщение20.02.2012, 20:56 
Заморожен


10/10/11
109
Zealint в сообщении #541008 писал(а):
Тов. ZARATUSTRA, если у Вас такие сложности с программированием, то я бы советовал начать его изучение с более простых задач. То, о чем Вы спрашиваете, описывается в литературе для школьников. А здесь учебные программы за Вас пишут только при добром расположении духа, да и то это не совсем по правилам.

Простые задачи я изучил. Это не учебная программа), это задача по олимпиаде за прошлый год. Я и не прошу писать решение этой задачи. Смысл тогда мне готовое решение получить? Мне нужно разобраться с кусочком кода.

 Профиль  
                  
 
 Re: Олимпиадная задачка.
Сообщение21.02.2012, 16:56 


04/06/10
117
ewert
олололо, массив из миллиона элементов.

Чего-нибудь вроде хеш-таблицы хватит. Нафига считать элементы, которые не встречались.

 Профиль  
                  
 
 Re: Олимпиадная задачка.
Сообщение23.02.2012, 09:10 
Заслуженный участник
Аватара пользователя


14/02/07
2648
А я вот придумал, надо всего 16 чисел хранить. Подсказка: по условию, на кодирование элементов последовательности хватит 16 битов.

(решение)

$k$-й элемент массива numofbits -- количество чисел в последовательности, у которых $k$-й двоичный бит равен единичке. Иными словами, очередной член последовательности надо преобразовать в массив битов и прибавить поэлементно к numofbits. После того, как все члены последовательности перебраны, выдать число, у которого в двоичной записи на $m$-м месте единичка тогда и только тогда, когда numofbits[m]>N/2.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group