Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

функция давления кирпича пирамиды

#алгоритм #математика #любой_язык


Есть двумерная пирамида из кирпичей. Вес 1го - 1 кг, давит равномерно на 2 под ним
по 0.5кг.
То есть, если на верхний давит +100 кг, тогда под ним на каждый будет (100+1)/2 кг
- на нижний давит пол веса каждого над ним.

1,0=.5 2,0=.75 2,1=1.5 3,0=.875 3,1=.2.125

Как вычислять давление на любой из них, указывая позицию, например, к4-2, к8-4 ...
к(рядСверху,номерСлева) - как функция с 2 параметрами, возвращающая вес?

Думал, pяд*.5 + (pяд-1)/2 или 1*(c+1) / 2*p + 1*c / 2*p, разные другие варианты,
но никак не могу подобрать точный. (желательно на java)
    


Ответы

Ответ 1



А почему не воспользоваться рекурсией? Значения веса, номер ряда и номер кирпича в ряду вставляйте какие вам надо: public static void main(String[] args) { float weight = 1; //вес кирпча int row = 5; //номер ряда начиная с 1 с верху int num = 3; //номер кирпича слева (или с права, как больше нравится) с 1 System.out.println(pressueOnBrick(row, num, weight)); } //давление на один кирпич public static float pressueOnBrick(int row, int num, float weight) { return pressue(row, num, weight) - weight; //давление оказываемое на один кирпич = полное //давление которое оказывает кирпич минус вес кирпича } //полное давление оказываемое кирпичём (включая свой вес) public static float pressue(int row, int num, float weight) { //в ряду не может быть кирпичей с номером меньше 1 и больше чем номер ряда(число кирпичей в ряду = номеру ряда) if (num < 1 || num > row) { return 0; } //давление которое оказывает кирпич равно сумме веса кирпича и половине веса кирпичей которые давят на него //слева и справа return weight + (pressue(row - 1, num - 1, weight) + pressue(row - 1, num, weight)) / 2; } Валидация вводимых значений на вашей совести.

Ответ 2



#include #include int main() { unsigned ranks{}; std::cin >>ranks; // общее количество рядов double weight{}; std::map loads; unsigned k{1}; for (; k <= ranks; ++k) { loads.insert(std::make_pair(k, weight)); weight = (weight + 1)/2; } std::cout << std::endl << "вводим нужный ряд: " << std::endl; std::cin >> k; std::cout << "нагрузка для кирпичей " << k << " - го ряда: " << loads[k]; return 0; } После обсуждения с goldstar_labs пришел к выводу переписать, поскольку первый вариант верный для двух рядов и для крайных кирпичей #include #include using std::vector; using std::cin; void setValue(const vector& p1, vector& p2) { size_t k = p2.size(); if (k <= 2) return; for (size_t i = 1; i < k - 1; ++i) p2[i] += (p1[i] + 1)/2; } int main() { unsigned ranks{}, k{}; cin >>ranks; // общее количество рядов double w{}; vector< vector > weights; for (unsigned n = 1; n <= ranks; ++n) { vector v(n, w); weights.emplace_back(v); if (n > 2 ) setValue(weights[n - 2], weights[n - 1]); w = (w + 1)/2; } std::cout << std::endl << "вводим нужный ряд: " << std::endl; std::cin >> k; k %= ranks + 1; std::cout << "нагрузки для кирпичей " << k << " - го ряда:\n"; for (double d : weights[k - 1]) std::cout << d << ' '; return 0; } Выводить, думаю вы сами сможете в желаемом формате

Комментариев нет:

Отправить комментарий