Skip to content

Instantly share code, notes, and snippets.

@KolosovAO
Last active July 20, 2018 13:00
Show Gist options
  • Save KolosovAO/52961bab1f6e290f6d2aa3d89e91a11e to your computer and use it in GitHub Desktop.
Save KolosovAO/52961bab1f6e290f6d2aa3d89e91a11e to your computer and use it in GitHub Desktop.

Каждый раз, когда происходит выстрел, возможны два исхода, охотник попал или промахнулся. Вероятность первого - p, второго - 1-p. И соответсвенно общая вероятность этого события становится равна prevP * p. Имеет смысл упорядочить массив вероятностей попадания, чтобы сократить количество возможных ветвлений. Так как когда ветвление достигнет нужного количества убийств, его можно прекращать.

Браконьер стреляет в животное, вероятность убить которое максимальное из оставшихся. В случае попадания, нужное количество жертв уменьшается на один. Иначе остается прежним. Вероятности перемножаются prevP * p. Общая верояность будет равна их сумме. Если в каком то из ветвлений оставшиеся количество животных меньше необходимого количества, то можно его прекращать, и считать сумарную вероятность убить на этом ветвлении равной 0.

function solve(arr, k) {
    arr.sort((a, b) => a[1] - b[1]);

    return findProbability(arr, k); // изначально вероятность равна 1.
}

function findProbability([animal, ...other], count, probability = 1) { // текущее животное и оставшиеся
    if (count > other.length + 1) return 0;
    if (count === 0) return probability;
    if (!animal) return 0;

    return findProbability(other, count - 1, probability * animal[1]) +
        findProbability(other, count, probability * (1 - animal[1]));
}


console.log(solve([ ["медведь", 0.5], ["тигр", 0.5], ["лев", 0.5] ], 2))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment