С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 28.01.2016
Сообщений: 7
1

Определить минимальное число пирамид которое требуется сложить

11.02.2017, 16:00. Показов 6332. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Капитан Вася всегда держит на своем корабле запас пушечных ядер для борьбы с пира-
тами. Так как он привык во всем поддерживать порядок, он хранит ядра в виде пирамид.
Каждый из слоев одной пирамиды является равносторонним заполненным ядрами треуголь-
ником, сторона которого содержит ровно k ядер. Сторона основания пирамиды состоит из
n ядер, в следующем слое сторона состоит из n − 1 ядра, и т.д., пока на вершину не будет
положено одно ядро (которое является равносторонним треугольником со стороной 1).
Например, пирамида размера 3 состоит из трех уровней, выглядящих так (сверху вниз):
C++
1
2
3
4
5
6
7
8
X
 
 X
X X
 
  X
 X X
X X X
Ясно, что каждый из треугольников может содержать только 1, 3, 6, 10 и т.д. ядер. Таким
образом, пирамида может содержать только 1, 4, 10, 20, и т.д. ядер.
Вася отправляется в плавание и берет с собой ровно m ядер. Какое минимальное число
пирамид требуется ему сложить из них на своем корабле?
C++
1
2
3
4
5
6
7
Входные данные 
5
1
5
9
15
91
C++
1
2
3
4
5
6
Выходные данные
1
2
3
3
2
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2017, 16:00
Ответы с готовыми решениями:

Определить минимальное число, которое может получиться в результате работы калькулятора
В качестве домашнего задания по информатике ученикам предложено разработать специальный...

Дан массив A(n,m). Требуется определить минимальное по величине число
Дан массив A(n,m). Требуется определить минимальное по величине число

Определить число возможных пирамид
Доброго времени суток! Необходимо определить количество возможных пирамид, составленных из n...

Определить, какое минимальное число операций умножения требуется для перемножения s матриц
Задана группа матриц A1, A2, …, As. Каждая матрица Ai задана размерами ni, mi, причем mi=ni+1....

4
Модератор
Эксперт по электронике
8541 / 4393 / 1651
Регистрация: 01.02.2015
Сообщений: 13,650
Записей в блоге: 9
11.02.2017, 19:17 2
Я бы реализовал и сверил два подхода:
1. Условно говоря "тетраэдрическая система счисления".
2. Динамическое программирование.

Тетраэдрические числа:
https://ru.wikipedia.org/wiki/... ские_числа
1, 4, 10, 20, 35, 56, 84, 120, 165, 220, 286, 364, 455, 560, 680, 816, 969, … (последовательность A000292 в OEIS).

Решение по 1-му варианту отпадает, т.к. даже в примере для 91 результат 2. А при переводе в "тетраэдрическую систему счисления" получили бы 91=84+4+1+1+1, хотя решением является 91=35+56.

Значит остаётся динамическое программирование. Алгоритм будет напоминать и алгоритм Дейкстры и решение задачи "калькулятор на 3 действия" - Определите, какое наименьшее число операций необходимо, чтобы получить из числа 1 число N
1. Пусть определён массив T[300000+1], каждый элемент которого T[i] в конце вычислений будет хранить минимальное количество пирамид.
2. Инициализируем T[]
- заполняем все элементы значением MAX_INT - подобие бесконечности.
- последовательно вычисляя тетраэдрические числа i, заполняем соответствующие T[i] единицами
3. Начиная с максимального тетраэдрического числа, входящего в массив T[] выполняем следующее
- пусть CurrTetrahedral - текущее тетраэдрическое число (для него T[CurrTetrahedral]==1)
- пусть CurrMin - текущее минимальное количество пирамид. В момент рассмотрения числа i==CurrTetrahedral, значение CurrMin равно 1.
- рассмотрим число i=i+CurrTetrahedral. Для него CurrMin=CurrMin+1. Но ведь в T[i] уже что-то хранится. Тогда, для обеспечения минимального числа пирамид T[i]=min(T[i], CurrMin). Ну и т.к. T[i] возможно изменилось - пересчитаем и CurrMin=T[i].
- перейдём к следующему i, пока не переберём все индексы массива T[]
- после рассмотрения всех вариантов для CurrTetrahedral, возьмём предыдущее тетраэдрическое число - обновим CurrTetrahedral (будем искать в T[j] вниз, пока не найдём T[j]==1)

После всего этого, получим массив T[i], из которого и будем брать ответы.

Можно прикрутить рекурсию в инициализацию для вычисления следующего тетраэдрического числа, а при выходе из рекурсии - выполнять перебор индексов для него. Это сократит перебор при поиске предыдущего числа.
1
1682 / 1095 / 489
Регистрация: 17.07.2012
Сообщений: 5,360
12.02.2017, 19:43 3
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Когда-то давно писал, вот готовый код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main() {
    const size_t inf = 3e5;
    vector <size_t> a(inf + 1, inf);
    a[0] = 0;
    for (size_t i = 1; i < a.size(); i++) {
        size_t s1 = 0, s2 = 0;
        for (size_t j = 1; ; j++) {
            s1 += j;
            s2 += s1;
            if (i >= s2) a[i] = min(a[i], a[i - s2] + 1);
            else break;
        }
    }
    size_t t;
    cin >> t;
    for (size_t i = 0; i < t; i++) {
        size_t m;
        cin >> m;
        cout << a[m] << "\n";
    }
}
0
0 / 0 / 0
Регистрация: 28.01.2016
Сообщений: 7
18.02.2017, 08:14  [ТС] 4
ФедосеевПавел, Удалите пожалуйста тему "Определить минимальное число пирамид которое требуется сложить" - C++
0
Модератор
Эксперт по электронике
8541 / 4393 / 1651
Регистрация: 01.02.2015
Сообщений: 13,650
Записей в блоге: 9
18.02.2017, 21:17 5
viktoriua97, это неподвластный мне раздел, в этом разделе у меня равные с вами права и обязанности.
Но кроме моего бессилия, ещё есть правила форума, согласно которым
2.2. Сообщения и темы, а также другой контент, размещаемый на форуме, по просьбам пользователей не удаляется и не закрывается.
0
18.02.2017, 21:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2017, 21:17
Помогаю со студенческими работами здесь

63. Дано натуральное число n (n<10000). Вывести минимальное число, которое получится из цифр числа n
Нек разрешается использовать массив.

Минимальное число которое делиться на 17
Напечатать минимальное число, большее 200, которое нацело делится на 17.

Минимальное число, которое делится нацело
Необходимо решить задачу с помощью цикла! Условие: Напечатать минимальное число, большее 200,...

Минимальное число, которое больше средне гармонического
Вот такое задание, помогите его сделать, пожалуйста, на VBA. Порядковый номер минимального из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru