|
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
|
||||||
Из заданного числа используя заданный набор операций получить единицу12.07.2018, 20:00. Показов 8015. Ответов 51
Метки нет (Все метки)
Кликните здесь для просмотра всего текста
(Название задачи -) Число - 3
(Время: 1 сек. Память: 16 Мб Сложность: 35%) Дано натуральное число N. Над ним можно произвести следующий набор операций: вычитать единицу; делить на три, если число кратно трем; делить на два, если число четное. После выполнения одной из операций к полученному результату также можно применить указанные операции, и делается это до тех пор, пока результат не окажется равным 1. Входные данные Входной файл INPUT.TXT содержит натуральное число N (N ≤ 10^6). Выходные данные В выходной файл OUTPUT.TXT выведите наименьшее количество операций, в результате выполнения которых будет получена единица. Примеры
Задача относится к теме Динамическое программирование но я не могу понять где тут динамика. Хотя решил порядка 10 задач на динамику. Буду благодарен за любой совет или код
1
|
||||||
| 12.07.2018, 20:00 | |
|
Ответы с готовыми решениями:
51
Возведение заданного целое числа в целую неотрицательную степень, используя минимум операций умножения Замена четных цифр заданного числа на единицу |
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
|
| 13.07.2018, 23:00 | |
|
1
|
|
|
Комп_Оратор)
|
||
| 13.07.2018, 23:04 | ||
|
2
|
||
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
|
| 13.07.2018, 23:06 | |
|
1
|
|
|
Комп_Оратор)
|
|||
| 14.07.2018, 01:29 | |||
|
2n=3p где p должно быть чётно так как 3 - нечётно а слева - чётное число. Причём каков бы нибыл ранг чётности (выделяемая степень 2-ки в качестве сомножителя) числа p, либо слева сократится до 1, либо справа сократится вся чётная часть, а слева останется минимум 2. То есть, невозможно. Байт, меня интересовал, более сложный вопрос. Я имею соображения, конечно, но я не такой математик чтобы не слушать, а говорить. В разделе физика, например, мне говорить легче. Но раз математики молчат, придётся мне провоцировать обсуждение своими сентенциями. Скорее всего наивными, с точки зрения математиков. Итак вопрос: Когда имеет смысл делить на 2 ? Я пришёл к выводу, что это имеет смысл делать тогда, когда число делимо на 4, или если результат сокращения на 2 уменьшенный на 1 cократим на 3. Мои нехитрые мысли я вначале изложил сумбурно и неверно, а в процессе редактирования понял, что не успеваю написать всё как хотелось бы. Может позже. Байт, я понимаю как это выглядит с точки зрения математиков. Вот почему я хотел слушать, а не говорить. На одном канадском сайте (QUORA -очень известный сайт) я объяснял почему ускорение направлено именно внутрь кривой траектории. Сочинилась вот такая шутка:
То есть как-то так. Надеюсь, это улыбнуло.
2
|
|||
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
||
| 14.07.2018, 10:18 | ||
|
Пусть есть 2 числа N > M. Тогда есть несколько путей, ведущих из N в M (под "путем" я имею в виду совокупность шагов допустимого вида). И для некоторых пар (N, M) оптимальным является путь, не содержащий делений на 2. Наверное, не трудно показать, что это действительно так. И даже провести исчерпывающее исследование таких пар. Однако, я не уверен, что это как-то поможет решению задачи. Но само исследование множества таких пар может представлять некоторый, чисто математический интерес. (Ведь каких только задач не придумывают себе Математики! И с каким удовольствием пытаются их решить!) Добавлено через 20 минут А что касается моего вполне неуклюжего алгоритма из поста 4, то конечно, все нужно делать ровно наоборот. То есть идти от заданного числа вниз. Детали ввиду сегодняшней жары изложить не берусь. Но идея такая. Заводим массив int *x = malloc(N+1). Заполняем его -1, а x[1] = 0 Теперь берем n. Если x[n] неотрицательно, проходим обратно по пути приведшему нас в эту точку и расставляем там x[n]+1, x[n]+2 и т.д. если там уже не стоят меньшие неотрицательные числа. В противном случае рекурсивно исследуем n-1, n/2, n/3 Не исключено, что нечто похожее уже предлагалось в этой теме, но опять же - жара! ЗЫ. Имхо, такой подход вполне может претендовать на звание "динамического"
2
|
||
|
26 / 23 / 12
Регистрация: 25.06.2018
Сообщений: 91
|
||||||
| 14.07.2018, 11:26 | ||||||
|
Задача интерсная. Но без рекурсии ее тяжко решить. Первое: минимальных путей может быть несколько. Если нужно определить только один путь, неважно какой, то просто.(Если все минимальные пути, то напишите и я дам код)
Второе, максимальный путь - это путь уменьшения на 1. Поэтому напишем простенькую функцию нахождения минимального пути
1
|
||||||
|
Комп_Оратор)
|
||||||||
| 14.07.2018, 13:02 | ||||||||
![]() Думал Вы меня избавите от этой чаши. Хотя мне ли в первой ли? Ой, как говорится, - ЛИ. Я вчера наночь глядя пытался изложить, но вместо этого наложил так, что еле-еле потом всё убрал. Но видно придётся ещё разик. И так далее. Это возможно, но громоздко. Мне нравится матиндукция. Рекурсия везде даёт чудовищный прирост снижения сложности. И так начали. Но имейте ввиду, дорогой Байт, всё дальнейшее - результат полного отсутствия выбора. Асеоматика и терминология. Назовем операцией A преобразование уменьшающее число a0 : например, A(a0) = D3 (деление на 3) или A(a0) = D2 (деление на 2) или A(a0) = D1 (вычитание 1). Поскольку задача состоит в максимально быстром уменьшении исходного числа, то операции по эффективности можно расположить в следующем порядке: D3 > D2 > D1 Процесс применеия операции - шаг вычислений будем записывать: a1 -> A(a0) в общем виде и для случаев A= DN : a1 -> DN(a0). Например для деления на 3, это будет выглядеть как a1 -> D3(a0). Введём понятие ранга делимости числа nn, так что n3 это ранг делимости на 3, n2 - соответственно, - на 2 и т.д. То есть если число a0 имеет n3=2 то оно делится на 9, а если у него ещё и n2=3 то оно делится и на 8 к тому же. Соответственно у простого числа a есть только два ранга na=1 и n1=var. Эти ранги есть у любого числа и говорить о них обычно нет смысла. Назовём их тривиальными и далее если не сказано специально, будем называть рангами только нетривиальные ранги. Так число имеющее только (нетривиальный) ранг n2 - это число представляющее из себя степень числа 2. Как уже доказано числа с единственным n2 не могут иметь n3 отличного от 0. То есть на 3 они делиться не могут (3 в степени 0 это 1 - то есть, - вырожденный до тривиального, случай). Этот простой вывод пригодится в дальнейшем. Он важен в том смысле, что если у числа a0 n2>1 и n3>1 то рано или поздно придётся делить и на 2 и на 3 проводя операции независимо друг отдруга. Как будет видно, для n2=1 случай особый. Но - по порядку. Если мы имеем a0 с n3>0 то ясно, что операция A=D3 лучший выбор, так как она старше всех (наиболее эффективна) и так как рано или поздно её всё равно придётся провести. Таким образом рекурсивно доказано, что любое исходное число превращается в число с n3=0 (не делимое на 3) минимальным количеством операций и все они A=D3. Пусть a0 уже имеет n3=0. Это значит, что имеются лишь две возможности: A=D2 и A=D1. На первый взгляд кажется, что D2 если она возможна (n2>0) лучше, чем D1, но оказывается, это не всегда так. Это потому что D1 очень отличается от D3 и D2 тем, что её (D1) результат, в отличие от них изменяет признаки делимости на 2 и 3, влияя на применимость остальных операций (как мы видели ранее D2 и D3 не влияют на возможность проведения друг друга и тем более D1 которая возможна всегда). То есть, если n2=1 и мы проведём D2, то останется лишь D1 (мы оговорили, что a0 имеет n3=0). Итого начав с D2 мы обречены на последовательность D2, D1. А вот если мы начнём с D1, то возможны случаи когда n3 станет n3>0. Тогда мы получаем возможность для пары D1, D3, которая эффективнее D2, D1. То есть, если n2=1, то следует проверить не делится ли на 3 результат D1(a0) и если это так, то выбирать D1, D3 вместо D2, D1. Но если a0 имеет n3=0, а n2>1, то ситуация меняется. Пусть n2 = 2. Тогда если мы выберем D1, D3 (если он даже возможен), то очевидно проиграем варианту D2, D2 поскольку разделить на 4 это выгоднее чем уменьшить в 3 раза и вычесть 1. То есть, если n2=2 и более, нужно разделить на 2 (D2), а потом проверить не понизилоь ли n2 до 1. То есть, пока n2>1 можно смело делить на 2 (D2,D2,D2...), а как только n2=1, то нужно поверять a1->D1(a0) на n3>0. Очевидно, что D1 применяется всегда, когда n2=n3=0. Вот пожалуй и всё. Теперь легко написать условия для решения данной задачи (см. листинг).
3
|
||||||||
|
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
|
||
| 14.07.2018, 13:25 [ТС] | ||
|
Насчёт рекурсии, вообще первое что приходит в голову при решение таких задач это организовать перебор и найти то что тебе нужно с помощью этого перебора, но ограничения большие и не дают так просто решить задачу поэтому можно написать рекурсию заметить закономерность в переборе и повторяющиеся шаги которые были уже вычислены уже не вычислять заново а просто взять из массива(массив как кеш для нашей рекурсии) значение и дальше уже то что тебе самому нужно сделать с этим значением то и делаешь. В данной задаче я не уверен что такой подход эффективен или даже применим
0
|
||
|
Комп_Оратор)
|
||
| 14.07.2018, 13:52 | ||
|
0
|
||
|
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
|
|
| 14.07.2018, 14:04 [ТС] | |
|
0
|
|
| 14.07.2018, 14:06 | |
|
0
|
|
|
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
|
||
| 14.07.2018, 14:32 [ТС] | ||
|
Мой интернет меня просто убивает. Эти слова явно лишние тут
0
|
||
| 14.07.2018, 14:32 | |
|
Опpеделить пpомежуток минимальной длины, содеpжащий заданный набор числа Установить в единицу каждый второй бит заданного целого числа
Из одного числа получить второе, заменив каждую цифру на единицу
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|