алгоритм поединка (вероятности)

397
05 августа 2018, 00:40

У меня вопрос по этой задаче:

Поединок начинается с того, что оба соперника располагаются на расстоянии двадцати шагов друг от друга, и каждому дается только один выстрел и, соответственно. В течение поединка соперники ходят по очереди, каждый ход участник может либо сделать шаг вперед, либо произвести выстрел. Чем ближе находятся соперники друг к другу, тем выше шанс попадания. При этом шанс попадания увеличивается линейно, начиная с определенного значения в начале поединка до 100% при полном сближении. Сложность состоит в том, что если вы сделаете выстрел и промахнетесь, соперник будет иметь право сделать необходимое количество шагов, подойти к вам вплотную, и выстрелить с гарантированным попаданием, что обеспечит ему победу. Создайте алгоритм, который, отталкиваясь от заданных значений шансов попадания для вас и соперника в начале поединка, будет определять номер шага когда вам нужно произвести выстрел для получения наиболее высоких шансов на победу.

Входящие параметры: Значения шансов попадания в начале поединка для каждого участника(например 0.1 и 02, тогда для первого участника с каждым шагом шанс попадания будет расти на 0.09 а для второго на 0.08), а также номер участника, который ходит первым.

Выходные данные: Наиболее оптимальный шаг для произведения выстрела.

Я сделал следуйщий код, но вывода не последовало. Где-то на форуме видел совет, что нужно стрелять когда вероятность попасть на этом шаге больше чем вероятность попасть у противника на следуюшем

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Input start probabilities:");
        double first = scanner.nextDouble();
        double second = scanner.nextDouble();
        System.out.println("Input number of player starting first:");
        int player = scanner.nextInt();
        double[] prob = {first, second};
        double[] resprob = {((1 - first) / 10 ),((1 - second) / 10)};
        for(int i = 9;i<=0;i--){
            if((resprob[0]*i)+prob[0]>(resprob[1]*i-1)+prob[1]){
                System.out.println("The optimal shot range is:"+i);
            }
        }
    }
}
Answer 1

Если я правильно понял условие, то вот решение:

import java.util.Scanner;
public class Test4 {
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Input start probabilities:");
    double first = scanner.nextDouble();
    double second = scanner.nextDouble();
    System.out.println("Input number of player starting first:");
    int player = scanner.nextInt();
    int n =20;
    double[] prob = {first, second};
    double[] resProb = {((1 - first) / n ),((1 - second) / n)};
    if(player==1) {
        for (int i = 0; i <= n - 1; i++) {
            if ((resProb[0] * i) + prob[0] > (1 - resProb[1] * (i + 1) - prob[1])) {
                System.out.println("The optimal shot range is:" + i);
                break;
            }
        }
    }
    else{
        if(prob[1]>1-resProb[0]-prob[0]){
            n=n-1;
            System.out.println("The optimal shot range is: " + n);
        }
        else{
            for (int i = 0; i <= n - 2; i++) {
                if ((resProb[0] * i) + prob[0] > (1 - resProb[1] * (i + 2) - prob[1])) {
                    System.out.println("The optimal shot range is: " + i);
                    break;
                }
            }
        }
    }
}

}

Первый цикл решает задачу, если мы ходим первыми. Дальше мы проверяем: если второму выгодно выстрелить на первом шаге, то тогда он выстрелит и мы будем стрелять ему в упор, если он не стреляет, то задача превращается в первую, но на шаг меньше.

READ ALSO
Property файл в struts

Property файл в struts

Изучаю struts2 по официальной документации, но ничего не получается с примером с property файломПример работает исправно, но при попытке запустить...

228
Android Google maps ошибка получения пути

Android Google maps ошибка получения пути

Хочу проложить маршрут между двумя точками Но выкидывает ошибку, хотя PostMan выдает результатВ чем ошибка?

251