Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Задача: пропавшее число

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Задача: пропавшее число
Имя
Сообщение << Старые топики   Новые топики >>
Задача: пропавшее число - 2010-11-02 01:48:20.123333   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
Задача на несколько этапов. Этап первый.

Есть набор чисел от 1 до 100, причём каждое число встречается ровно один раз. Из этого набора наугад убирают одно число. Как за один проход и с фиксированным количеством памяти узнать, какое именно число было убрано?
Post #: 1
RE: Задача: пропавшее число - 2010-11-02 09:06:05.320000   
Flint_ta

Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
Возможно задачу не до конца понял.
1. получить сумму всех чисел от 1 до 100.
2. получить сумму оставшихся чисел (после того как наугад одно убрали)
3. разница сумм в п.1. и п.2 есть число которое убрали.
Post #: 2
RE: Задача: пропавшее число - 2010-11-02 09:49:51.670000   
disCoverall

Сообщений: 32
Оценки: 0
Присоединился: 2010-10-31 00:43:50.613333
int x,y,;
cout << "Введите убираемое число";
cin>>x;
y= x;
cout << "Ваше число";



xDDD)
Post #: 3
RE: Задача: пропавшее число - 2010-11-02 13:00:02.420000   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
quote:

ORIGINAL: Flint_ta

Возможно задачу не до конца понял.
1. получить сумму всех чисел от 1 до 100.
2. получить сумму оставшихся чисел (после того как наугад одно убрали)
3. разница сумм в п.1. и п.2 есть число которое убрали.

Да нет, ты всё правильно понял, поэтому этап номер следующий: что делать, если убрали не одно, а два числа?
:)
Post #: 4
RE: Задача: пропавшее число - 2010-11-02 15:45:54.990000   
Родригес

Сообщений: 444
Оценки: 0
Присоединился: 2010-04-16 20:28:58.240000
quote:

что делать, если убрали не одно, а два числа?

Будут несколько вариантов.
Найти способом Flint_ta разность X и найти все варианты:
1 и X-1
2 и X-2
3 и X-3

Post #: 5
RE: Задача: пропавшее число - 2010-11-02 16:15:57.426666   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
quote:

ORIGINAL: Родригес

Будут несколько вариантов.
Найти способом Flint_ta разность X и найти все варианты:
1 и X-1
2 и X-2
3 и X-3


Эээ неее, вариант должен быть только один. У тебя есть один проход, чтобы просканировать все числа, и константное количество памяти, чтобы определить каких именно чисел не хватает.
Post #: 6
RE: Задача: пропавшее число - 2010-11-02 16:40:25.003333   
Родригес

Сообщений: 444
Оценки: 0
Присоединился: 2010-04-16 20:28:58.240000
А, не понял сперва задачи, прошу прощения.




Когда я был сопливым ребенком, по соседству жил парень, лет на 10-12 старше, он показывал такой фокус - давал нам колоду карт, мы незаметно вытаскивали одну, потом, перемешав, отдавали ему. Он колоду с очень высокой скоростью по одной карте скидывал, а потом называл недостающую. Секрет так и не открыл, до сих пор не знаю, он как то считал или же запоминал все.
Post #: 7
RE: Задача: пропавшее число - 2010-11-02 16:42:19.866666   
Родригес

Сообщений: 444
Оценки: 0
Присоединился: 2010-04-16 20:28:58.240000
Константое это сколько?
Post #: 8
RE: Задача: пропавшее число - 2010-11-02 17:24:57.470000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: Родригес
Константое это сколько?

Независящее от исходного количества чисел. Твой алгоритм должен потреблять одинаковое количество памяти, вне зависимости от того, сто чисел в наборе, тысяча или мильён.
Post #: 9
RE: Задача: пропавшее число - 2010-11-02 19:02:45.253333   
Родригес

Сообщений: 444
Оценки: 0
Присоединился: 2010-04-16 20:28:58.240000
Пусть количество членов набора чисел - N , числа от 1 до N.
1 Находим сумму набора ∑=(1+N)N/2
2 Находим произведение всех членов N! ( Нет необходимости хранить все цифры числа, достаточно нескольких значащих цифр и порядка, например так: 2,6525285e+32. )
3 Последовательно считывая по одному элементу находим сумму и произведение оставшихся чисел
4 Разделив N! на произведение оставшихся чисел найдем произведение искомых двух чисел (после округления)
5 Отняв от ∑ сумму оставшихся чисел найдем сумму искомых двух
6 Нехитрая математика позволит из произведения и суммы найти два числа

Не совсем то, что говорил rgo, N ограничена количеством значащих цифр произведения.
Post #: 10
RE: Задача: пропавшее число - 2010-11-02 19:42:46.086666   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: Родригес
Пусть количество членов набора чисел - N , числа от 1 до N.
1 Находим сумму набора ∑=(1+N)N/2
2 Находим произведение всех членов N! ( Нет необходимости хранить все цифры числа, достаточно нескольких значащих цифр и порядка, например так: 2,6525285e+32. )
3 Последовательно считывая по одному элементу находим сумму и произведение оставшихся чисел
4 Разделив N! на произведение оставшихся чисел найдем произведение искомых двух чисел (после округления)
5 Отняв от ∑ сумму оставшихся чисел найдем сумму искомых двух
6 Нехитрая математика позволит из произведения и суммы найти два числа

Да, особенно понравилось про "Нет необходимости хранить все цифры числа", как-то я об этом не подумал. Действительно, если мы будем считать произведение всех чисел по модулю 2^32, нам этого хватит. А умножение по модулю 2^32, это как раз то самое умножение unsigned int'ов, которое дают нам компиляторы (по-крайней мере бОльшая их часть).
Единственная проблема в том, что деление-то компиляторы выполняют не по модулю 2^32, и математика окажется, всё же, с хитростями. Кстати, может даже ничего и не выйдет, 2^32 – это не простое число, значит в кольце вычетов будут делители нуля, а это скорее всего приведёт к появлению множественных решений уравнения.

Считать же используя float, на мой взгляд не очень хорошо: там довольно-таки быстро мы получим переполнение. В single float, насколько я помню под показатель степени отводится восемь бит, причём знаковые восемь бит, значит максимальный множитель при мантиссе будет 2^127, а log[2](100!) ~= 524.765 > 127.

Но как бы там не было, мыслишь в правильном направлении. Нужно второе уравнение. Я бы предложил дополнительно к сумме всех чисел считать ещё сумму квадратов.
Post #: 11
RE: Задача: пропавшее число - 2010-11-02 21:38:46.660000   
Jakeroid

Сообщений: 12
Оценки: 0
Присоединился: 2010-01-26 23:34:43.993333
rgo,
quote:

Единственная проблема в том, что деление-то компиляторы выполняют не по модулю 2^32, и математика окажется, всё же, с хитростями.

Я не опытный в программировании. Но помню, что компилятор сможет делить быстрее если использовать сдвиги. Тоесть перевести число в двоичный код, а потом сдвинуть. Вот что и куда, и как делить забыл. Извините.:)

Post #: 12
RE: Задача: пропавшее число - 2010-11-02 23:58:15.153333   
disCoverall

Сообщений: 32
Оценки: 0
Присоединился: 2010-10-31 00:43:50.613333
quote:

rgo
Я бы предложил дополнительно к сумме всех чисел считать ещё сумму квадратов.

В принципе можно было бы модифицировать теорему ферма, было бы просто замечательно
Post #: 13
RE: Задача: пропавшее число - 2010-11-03 12:41:02.260000   
Davey

Сообщений: 45
Оценки: 0
Присоединился: 2010-03-24 14:51:57.760000
Kreol, за один проход, всмысле чтобы асимптотика была O(N) или чисто ОДИН проход + пару действий, то есть 2N не катит? >>
Кроме решений наподобие решения Родригеса вроде никак больше, если имеется в виду фиксированная память, это всмысле на всю программу, то есть входную последовательность тоже нельзя хранить?

А если сделать как у Родригеса, но с xor-ом. Вроде бы если все числа разные, то можно вторую ф-ю(после сложения) брать не умножение, а xor и не не должно сплющить…
Тогда в конце просто перебрать за линейное время варианты a b и подставлять их в выражение,
чтобы получилось что xor (a, b) = xor(всех между собой) xor (xor (тех что есть меж собой)).
Ну, разумеется xor всех между собой и тех что даны посчитаем один раз в начале и всё такое… Может я чего напутал?
Post #: 14
RE: Задача: пропавшее число - 2010-11-03 15:12:11.600000   
yurket

Сообщений: 69
Оценки: 0
Присоединился: 2009-05-04 23:47:54.993333
два уравнения:
1) a + b = x, где x = сумма_до - сумма_после
2) a^2 + b^2 = y, где y = сумма_квадратов_до - сумма_квадратов_после

решаем систему уравнений)
Post #: 15
RE: Задача: пропавшее число - 2010-11-03 17:59:36.783333   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
quote:

ORIGINAL: yurket

два уравнения:
1) a + b = x, где x = сумма_до - сумма_после
2) a^2 + b^2 = y, где y = сумма_квадратов_до - сумма_квадратов_после

решаем систему уравнений)

А доказать единственность корней сможешь?
Post #: 16
RE: Задача: пропавшее число - 2010-11-03 20:58:09.483333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: kreol
quote:

ORIGINAL: yurket
два уравнения:
1) a + b = x, где x = сумма_до - сумма_после
2) a^2 + b^2 = y, где y = сумма_квадратов_до - сумма_квадратов_после
решаем систему уравнений)

А доказать единственность корней сможешь?

А чего тут доказывать? Вот например геометрическое "доказательство". С точки зрения математики – это не доказательство, но с общечеловеческой покатит. Кому не покатит, пускай сочиняет либо чисто алгебраическое доказательство, либо допиливает сие геометрическое до нужных кондиций строгости.
Итак. Если нарисовать решения каждого уравнения в плоскости с осями a, b, то мы увидим, что картинка симметрична относительно прямой a=b. Второе уравнение – это окружность с центром в начале координат, первое же – прямая перпендикулярная прямой a=b. Очевидно, что прямая (1) будет пересекаться с окружностью (2) (у нас по определению системы там есть по-крайней мере одно решение). При этом прямая будет либо касаться окружности, либо пересекать её в двух точках.
Первый случай, когда прямая касается, на самом деле не имеет никакого отношения к нам. Если прямая будет касаться, то решение будет выглядеть как (a1, a1). Что будет означать что из набора удалили два одинаковых числа. Такого быть не может по условию задачи. Значит и прямая не будет касаться.
То есть определённо, прямая будет пересекать окружность в двух точках. Решений будет два, но в силу симметрии картинки, решения тоже будут симметричны. То есть если первое решение, это (a1, b1), то второе будет выглядеть как (b1, a1). И если мы вернёмся к условию задачи, мы увидим, что эти два решения, на самом деле для нас являются одним и тем же решением.
В принципе, чтобы было красивее, можно дополнить систему уравнений условием a<b.
Post #: 17
RE: Задача: пропавшее число - 2010-11-03 21:44:14.750000   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
quote:

ORIGINAL: Davey

Kreol, за один проход, всмысле чтобы асимптотика была O(N) или чисто ОДИН проход + пару действий, то есть 2N не катит? &gt;&gt;
Кроме решений наподобие решения Родригеса вроде никак больше, если имеется в виду фиксированная память, это всмысле на всю программу, то есть входную последовательность тоже нельзя хранить?

Обычно оба вопроса не имеют значения. Если тебе нужно собрать какую-то информацию о последовательности, уместившись в константную память, то всегда или почти всегда сделать это можно за один проход. Если тебе всё равно не разрешено бегать по всей последовательности много раз, то не вижу разницы между хранением в памяти или на диске/в сети/любым устройством с последовательным доступом. Но, если это тебе важно, то можешь использовать O(N) времени и хранить последовательность в памяти.
Post #: 18
RE: Задача: пропавшее число - 2010-11-03 21:51:37.816666   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
quote:

ORIGINAL: rgo

А чего тут доказывать?

В общем-то, верно. Но тогда скажу и третью, последнюю часть задачи :)
Обобщить решение для k убранных чисел. То есть для 3-х, 4-х, 5-ти и т.д.
При этом память должна зависеть линейно только от k, а время - от k и N.
Post #: 19
RE: Задача: пропавшее число - 2010-11-03 23:26:47.486666   
yurket

Сообщений: 69
Оценки: 0
Присоединился: 2009-05-04 23:47:54.993333
первое, что прихохдит в голову это составить k уравнений вида
a1^n + a2^n + … + ak^n = (сумма_чисел_в_степени_n_до - сумма_чисел_в_степени_n_после), 0 < n <= k
и решать систему из кучи уравнений неизвестно как =)
но это явно как-то не круто)
Post #: 20
RE: Задача: пропавшее число - 2010-11-04 00:08:56.866666   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: yurket
первое, что прихохдит в голову это составить k уравнений вида
a1^n + a2^n + … + ak^n = (сумма_чисел_в_степени_n_до - сумма_чисел_в_степени_n_после), 0 &lt; n &lt;= k
и решать систему из кучи уравнений неизвестно как =)
но это явно как-то не круто)

Дело не в том круто или нет. Не видно способа уложиться по времени в O(k). Можно избавиться от этих степенных уравнений, получить систему уравнений второй степени, где каждое уравнение будет суммой членов вида a[и]*a[j]. Но толку то?
Ведь даже если мы получим систему линейных уравнений, для которых существуют отработанные методы решений, то время решения будет O(k^3). По крайней мере метод гаусса требует O(k^3), и AFAIR, быстрее никак. Даже если бы мы получили сходу верхнетреугольную матрицу системы (еслиб ещё знать как…), это был бы O(k^2). В случае таких степенных/второй-степени уравнений, я думаю ситуация будет ещё плачевнее.

ps. Почесав затылок, я пришёл к такой мысли: kreol, скорее всего, не случайно начал докапываться к доказательству единственности решения системы. Мы видать пошли не тем путём, на который он рассчитывал. ;)
Post #: 21
RE: Задача: пропавшее число - 2010-11-04 00:46:35.546666   
disCoverall

Сообщений: 32
Оценки: 0
Присоединился: 2010-10-31 00:43:50.613333
rgo , монстр математики)
Post #: 22
RE: Задача: пропавшее число - 2010-11-04 09:40:51.910000   
Davey

Сообщений: 45
Оценки: 0
Присоединился: 2010-03-24 14:51:57.760000
Если хранить последовательность в памяти, то впринципе что мешает отсортировать перестановку(а как известно перестановку элементов от 1 до N можно отсортировать за O(N), while максимум 2N раз выполнится : for(int i=0; i&lt;n; i++) while(a[i] != i) swap(a[a[i]], a[i])... Ну и собственно после такой сортировки остается пройтись один раз по массиву и посмотреть на дыры.
Но Kreol наверно всё же хотел что-то другое, а так получается просто читерно… ^^
Post #: 23
RE: Задача: пропавшее число - 2010-11-04 11:24:57.460000   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
quote:

ORIGINAL: Davey

Если хранить последовательность в памяти, то впринципе что мешает отсортировать перестановку(а как известно перестановку элементов от 1 до N можно отсортировать за O(N)

Эээ, не знаю, что ты понимаешь под сортировкой перестановки, но последовательность отсортировать на O(N) у тебя вряд ли получится ;)
Post #: 24
RE: Задача: пропавшее число - 2010-11-04 12:10:41.216666   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
quote:

ORIGINAL: kreol

При этом память должна зависеть линейно только от k, а время - от k и N.

Пардон, неясно выразился. Память должна линейно зависеть от k и не зависеть от N, время должно просто как-то зависеть от k, но не от N (не считая первого прохода). Смысл в том, что k - это всегда небольшое число, которым можно манипулировать как угодно. Поэтому решение за k^3 легально. Другое дело доказать, что корни при этом решении будут единственными )
Post #: 25
RE: Задача: пропавшее число - 2010-11-04 16:08:30.033333   
Davey

Сообщений: 45
Оценки: 0
Присоединился: 2010-03-24 14:51:57.760000
Перестановка - всмысле были числа от 1 до N и все разные и их переставили местами. Тогда каждое мы просто ставим на свое место за максимум 2N действий. А про последовательность из любых чисел я и не заикался что за O(N), ничего не подумайте там^^
Post #: 26
RE: Задача: пропавшее число - 2010-11-04 18:38:11.363333   
yurket

Сообщений: 69
Оценки: 0
Присоединился: 2009-05-04 23:47:54.993333
а как предложение детектить на каджом шаге сумму текущих членов и сравнивать ее с суммой, которая должна быть без удаления?
1) цикл от 1 до n
2) Sn = (1+n)*n/2
3) Sn' = Sn' + n;
4) если Sn' == Sn то след. итерация,
если Sn' != Sn то явно было удалено число… или несколько чисел, идущих по порядку… в первом случае это одно n, тогда Sn' будет больше Sn на 1… во втором случае если, например, Sn' > Sn на 5, то значит было удалено 5 чисел, начиная с n…
5) записываем удаленное число (числа)…
6) устанавливаем Sn' = Sn, и на след. итерацию…
Post #: 27
RE: Задача: пропавшее число - 2010-11-04 23:17:01.546666   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
Насколько я понимаю, числа могут быть перетасованы. Иначе задачи бы не было, она решалась бы элементарно.
Post #: 28
RE: Задача: пропавшее число - 2010-11-06 21:39:45.956666   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
quote:

ORIGINAL: rgo

Насколько я понимаю, числа могут быть перетасованы. Иначе задачи бы не было, она решалась бы элементарно.

Верно.
Post #: 29
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Задача: пропавшее число







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.