Skip to content

Instantly share code, notes, and snippets.

@dbond762
Created July 29, 2018 18:04
Show Gist options
  • Save dbond762/3ad518850fabceeb6cf8ece9b037c54d to your computer and use it in GitHub Desktop.
Save dbond762/3ad518850fabceeb6cf8ece9b037c54d to your computer and use it in GitHub Desktop.
Совещание
package main
import (
"fmt"
"math/big"
)
// Выбираем первого сотрудника и соединяем его сначала с соседом, потом через одного. Линия делит команду на две части.
// Для каждой части делаем тоже и перемножаем результаты. Все произведения суммируем - это и есть ответ.
// Для 0 и 2 сотрудников, для расчётов, примем результат равным 1.
// Например, для n = 10
// f(0)*f(8) + f(2)*f(6) + f(4)*f(4) + f(6)*f(2) + f(8)*f(0) = 1*14 + 1*5 + 2*2 + 5*1 + 14*1 = 42
// Для решения воспользуемся методом динамического программирования.
func task112(n int) *big.Int {
arr := make([]*big.Int, n/2+1)
arr[0] = big.NewInt(1)
arr[1] = arr[0]
for i := 2; i <= n/2; i++ {
arr[i] = big.NewInt(0)
k := i - 1
for j := 0; j < i; j++ {
// arr[i] += arr[j] * arr[k]
arr[i].Add(arr[i], new(big.Int).Mul(arr[j], arr[k]))
k--
}
}
return arr[len(arr)-1]
}
func main() {
fmt.Println(task112(4))
fmt.Println(task112(10))
fmt.Println(task112(100))
}
@dbond762
Copy link
Author

@dbond762
Copy link
Author

Задача 112: Совещание (решение будет в понедельник)
Начинается совещание за круглым столом. Собралось N человек. Как им одновременно пожать руки друг другу так, чтобы руки никаких людей не пересекались. Вам необходимо вычислить кол-во вариантов, ктр они могут это сделать.

Входные данные: N - четное натуральное число от 2 до 100.

Вывод: кол-во способов, ктр они могут пожать друг другу руки.

Пример:
N = 4
Answer = 2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment