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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> несложная задачка, типа олимпиадной 
:(
    Опции темы
Alek86
Дата 11.11.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



не знаю, насколько тут приветствуются подобные задачки, но...

Есть массив из N чисел.

1. Он заполняется числами так:
    - числа эти лежат в пределах [1; N]
    - никогда не повторяются
    - в случайном порядке
(к примеру для N == 5 массив может иметь вид {2, 5, 3, 1, 4})

2. Одно (любое) из чисел меняется на N + 1.
(для преведенного выше примера это может быть {2, 5, 3, 6, 4})

3. Программе на вход подается полученный массив ({2, 5, 3, 6, 4}). Она должна определить, какое число заменили. Как можно быстрее.

Ответом должен быть код на С++, реализующий "поиск".

ЗЫ. кому задача покажется слишком легкой, прошу без комментариев - тут не только гении программизма бывают smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
JackYF
Дата 11.11.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Alek86, это в "Интересные задачи по программированию", имхо.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Alek86
Дата 11.11.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



да? не знал, что есть smile
извиняюсь


--------------------
user posted image    user posted image
PM MAIL   Вверх
Fazil6
Дата 11.11.2007, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



не понял в чем подвох...
вариант
Код

int  index_detect(int *array, int size)
{
    for(int i = 0; i < size ; ++i)
    {
        if(array[i] > size) return i;
    } 
    return -1;
}
недостаточно быстр?
PM MAIL   Вверх
Alek86
Дата 11.11.2007, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Fazil6 @  11.11.2007,  12:40 Найти цитируемый пост)
не понял в чем подвох...

для  {2, 5, 3, 6, 4} твоя программа выведет 3, а не 1, как требовалось

нужно не индекс, а ЧИСЛО определить smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
MAKCim
Дата 11.11.2007, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Alek86, 
Код

int data[MAX_COUNT + 1];

int detect(int * array, int size) {
    for (int index = 0; index < size; ++index)
        data[array[index] - 1] = 1;
    for (index = 0; index < size; ++index)
        if (!data[index])
            return index + 1;
}

итого O(n) + O(n) = 2 * O(n) ~ O(n)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



идея засчитана.
может кто ЕЩЕ лучше найдет?


--------------------
user posted image    user posted image
PM MAIL   Вверх
Fazil6
Дата 11.11.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Alek86 @  11.11.2007,  12:46 Найти цитируемый пост)
для  {2, 5, 3, 6, 4} твоя программа выведет 3, а не 1, как требовалось

а... я подумал, что нужно индекс определить
PM MAIL   Вверх
MAKCim
Дата 11.11.2007, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Код

int detect(int * array, int size) {
    int s = 0;
    for (int i = 0; i < size; ++i)
        s += array[i];
    return size - (s - size * (size + 1) / 2) + 1
}

итого O(n)

Добавлено через 4 минуты и 38 секунд
думаю, оптимальный вариант

Это сообщение отредактировал(а) MAKCim - 11.11.2007, 13:08


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



я ж говорил, несложная
быстро нашел
smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
Dov
Дата 11.11.2007, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Alek86 @  11.11.2007,  11:57 Найти цитируемый пост)
может кто ЕЩЕ лучше найдет?

Не знаю, лучше или нет, но тоже вариант.  smile 
Код

int detect(int * array, int size) {
    int s = *array ^ 1;
    for (int i = 1; i < size; ++i)
        s ^= array[i] ^= i + 1;
    return s ^ i + 1;
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Alek86
Дата 11.11.2007, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Dov @  11.11.2007,  18:58 Найти цитируемый пост)
Не знаю, лучше или нет, но тоже вариант.

ёпрст
проверил, работает. но КАК, даже разбираться не хочется...


если хотел как можно злостней решение придумать, ты цели достиг ;)


--------------------
user posted image    user posted image
PM MAIL   Вверх
bsa
Дата 11.11.2007, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Dov, вариант MAKCim, имхо, быстрей. Скорость выполнения XOR равна скорости выполнения сложения, а у тебя арифметических операций в 3 раза больше в каждой итерации цикла.
Хотя, для малых массивов твой вариант быстрее будет за счет отстуствия умножения (деление не считаю - любой порядочный компилятор обязан заменить его на сдвиг).

Это сообщение отредактировал(а) bsa - 11.11.2007, 19:40
PM   Вверх
Dov
Дата 11.11.2007, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Alek86 @  11.11.2007,  18:29 Найти цитируемый пост)
если хотел как можно злостней решение придумать, ты цели достиг ;


Alek86, ты чего?  smile Это самое простое решение, которое пришло мне в голову.  smile  Где-то здесь, на форуме(и не только на этом)  есть похожая задача, где нужно в массиве, состоящем из нескольких пар одинаковых чисел и одного непарного, например: {1,3,4,2,3,5,2,1,4}, найти это самое непарное число.  Так проще всего она решается именно этим способом. Проходим ХОR`ом весь массив и на выходе получаем искомое число. Что я и сделал.  smile 

Цитата(bsa @  11.11.2007,  18:38 Найти цитируемый пост)
Dov, вариант MAKCim, имхо, быстрей.

bsa, вполне возможно. Я хронометраж не делал.  smile 
Цитата(bsa @  11.11.2007,  18:38 Найти цитируемый пост)
Хотя, для малых массивов твой вариант быстрее будет за счет отстуствия умножения (деление не считаю - любой порядочный компилятор обязан заменить его на сдвиг).

bsa, а для больших массивов(на пару миллионов) у меня не  будет такой траблы, например:
Код

 for (int i = 0; i < size; ++i)
        s += array[i];  
 // cout << s;

Догадываешься?  smile 



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
DKroshkin
Дата 11.11.2007, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вроде задача простая на знание арифметической прогрессии.

Формул к сожалению не помню (учился давно, если надо могу вспомнить)

1. Бежишь по массиву, считаешь сумму, и вычисляешь кол-во элементов в массиве.
2. Вычисляешь сумму арифметической прогрессии
3. Вычитаешь из суммы, полученной в первом пунке сумму арифм. прогрессии
и еще вычитаешь N (кол-во элементов) - это и будет искомое число.

Скорость вычисления O(N)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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