У меня вопрос по этой задаче:
Поединок начинается с того, что оба соперника располагаются на расстоянии двадцати шагов друг от друга, и каждому дается только один выстрел и, соответственно. В течение поединка соперники ходят по очереди, каждый ход участник может либо сделать шаг вперед, либо произвести выстрел. Чем ближе находятся соперники друг к другу, тем выше шанс попадания. При этом шанс попадания увеличивается линейно, начиная с определенного значения в начале поединка до 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);
}
}
}
}
Если я правильно понял условие, то вот решение:
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;
}
}
}
}
}
}
Первый цикл решает задачу, если мы ходим первыми. Дальше мы проверяем: если второму выгодно выстрелить на первом шаге, то тогда он выстрелит и мы будем стрелять ему в упор, если он не стреляет, то задача превращается в первую, но на шаг меньше.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости