Форумчане, проблема с классом Random
Возникло вот такое недопонимание, логику выстроил верно и когда проверяю задачу через дебаггер все отрабатывается хорошо,но все равно не хочет проходить тесты.За не очень красивый код заранее извиняюсь(((.Задача взята с курсов https://hyperskill.org/learn/step/4940
Ваша задача состоит в том, чтобы найти семя между A и B (оба включительно), которое производит N псевдослучайных чисел от 0 (включительно) до K (исключительно). Он также должен иметь максимум этих N чисел, чтобы быть минимальным среди всех максимумов других семян в этом диапазоне.
Звучит сложно? Взгляните на этот пример.
Здесь мы имеем A = 7, B = 9, N = 4, K = 100. Давайте предположим:
Для семени 7 мы получаем последовательность 45, 99, 23, 67 – максимум 99. Для семени 8 мы получаем 64, 34, 23, 9 – максимум 64. Для семени 9 мы получаем 78, 34, 0, 11 – максимум 78.
Тогда минимум среди этих максимумов равен 64. Это означает, что в данном примере семя, которое мы ищем, равно 8.
Входные данные содержат числа A, B, N, K в одной строке в таком порядке.
Ваша задача-вывести 2 числа: семя и его максимум. Если есть несколько семян с равными минимальными максимумами, вы должны вывести семя, которое меньше, чем все остальные семена. Сообщить об опечатке
Пример Ввода 1:
0 100 5 1000
Пример Вывода 1:
18 270
Пример Ввода 2:
0 100 1000 1000
Пример Вывода 2:
5 993
Пример Ввода 3:
0 100 10000 1000
Пример Вывода 3:
0 999
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// write your code here
int a = scanner.nextInt();
int b = scanner.nextInt();
int n = scanner.nextInt();
int k = scanner.nextInt();
int[][] container = filler(a, b, n, k);
checker(container, a);
}
public static void checker(int[][] arr, int a) {
ArrayList<Integer> list = new ArrayList<>();
for (int[] row : arr) {
int max = 0;
for (int i : row) {
max = Math.max(max, i);
}
list.add(max);
}
int num = list.get(0);
for (int i : list) {
num = Math.min(num, i);
}
int seed = a + list.indexOf(num);
System.out.println(seed);
System.out.println(num);
}
public static int[][] filler(int a, int b, int n, int k) {
int[][] container = new int[b - a + 1][n];
while (a <= b) {
Random random = new Random(a);
for (int i = 0; i < b - a + 1; i++) {
for (int j = 0; j < n; j++) {
container[i][j] = random.nextInt(k);
}
}
a++;
}
return container;
}
}
Неудачный тест №1 из 5. неправильный ответ
Это пример теста из постановки задачи!
Тестовый вход: 0 100 5 1000 Правильный выход: 18 270
Вывод вашего кода: 49 463
Ответы (1 шт):
Нет смысла хранить все, что сгенерировано, в памяти. Можно хранить только нужный ответ. Код не проверял, но должно быть что то типа такого
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
int n = scanner.nextInt();
int k = scanner.nextInt();
int minOfMaxes = k;
int minOfMaxesSeed = a;
for(int i=a; i<=b; i++)
{
int localMax = 0;
Random rand = new Random(i);
for(int j=0; j<n; j++)
localMax = Math.max(localMax, rand.nextInt(k));
if (localMax < minOfMaxes){
minOfMaxes = localMax;
minOfMaxesSeed = i;
}
}
System.out.println(minOfMaxesSeed);
System.out.println(minOfMaxes);
}