Определите неудачные тестовые случаи - PullRequest
1 голос
/ 09 мая 2020

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

ПРОБЛЕМА ЗАЯВЛЕНИЕ:

Крутые девчонки (100 марок)

Профессор Утониум обеспокоен ростом преступности в мире. Количество злодеев и их деятельности значительно увеличилось. Нынешнее трио крутых девчонок не способно бороться со злом всего мира. Профессор решил создать максимальное количество Powerpuff Girls из имеющихся у него ингредиентов.

Для создания Powerpuff Girl требуется N ингредиентов в определенном количестве. У профессора в лаборатории есть все N ингредиентов, и он знает количество каждого доступного ингредиента. Он также знает количество определенного ингредиента, необходимого для создания Суперкрошки. Профессор занят подготовкой и хочет начать как можно скорее.

Злодеи, с другой стороны, хотят разрушить лабораторию и помешать профессору Утониуму создавать больше крутых девчонок. Моджо Джоджо готовится с боеприпасами, и Он возглавляет других злодеев, таких как Принцесса, Мальчики Амеба, Седуса, Гангрин Ганг и т. Д. c.

У профессора мало времени, злодеи скоро доберутся до лаборатории. Он начинает процесс, но не знает, сколько Суперкрошек будет создано. Ему нужна ваша помощь в определении максимального количества Powerpuff Girls, которые будут созданы с текущим количеством ингредиентов.

Пример:

Профессору Утониуму требуется 3 ингредиента для создания Powerpuff Girls. 3 ингредиента присутствуют в лаборатории в указанном количестве:

Чтобы сделать Powerpuff Girl, профессору Утониуму требуется:

3 единицы ингредиента A

6 единиц ингредиента B

10 единиц ингредиента C

Максимальное количество суперкрошек, которое может быть создано - 3, поскольку после 3 у профессора закончится ингредиент C.

Можете ли вы определить максимальное количество?

Формат ввода

Первая строка ввода состоит из количества ингредиентов, N

Вторая строка ввода состоит из N целых чисел, разделенных пробелами, представляющих количество каждого ингредиента, необходимое для создать Суперкрошку.

Третья строка ввода состоит из N целых чисел, разделенных пробелами, представляющих количество каждого ингредиента, присутствующего в лаборатории.

Constraints

1<= N <=10000000 (1e7)

0<= Quantity_of_ingredient <= LLONG_MAX 
Output Format

Вывести требуемый результат в виде отдельная строка.

Sample TestCase 1

Input
4
2 5 6 3 
20 40 90 50 
Output
8

КОД РЕШЕНИЯ

package com.mzk.poi;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class PowerPuffGirls {

    private static final String SPACE = " ";
    private static final Integer INITAL_IDX = 0;
    private static final Integer LOWER_IDX = 1;
    private static final Integer SECOND_IDX = 2;
    private static final Integer MAX_LINES = 3;
    private static final Integer UPPER_IDX = 1000000;
    private static String[] UnitsArr = null;
    private static String[] totIngrdientsArr = null;
    private static int size = 0;

    public static void main(String[] args) {
        List<Integer> maxPowerPuffGirlsCreationList = new ArrayList<Integer>();
        Scanner stdin = new Scanner(System.in);
        String[] input = new String[MAX_LINES];
        try {
            for (int i = 0; i < input.length; i++) {
                input[i] = stdin.nextLine();
                if (validateIngredienInput(input[INITAL_IDX])) {
                    System.exit(INITAL_IDX);
                }
            }
        } finally {
            stdin.close();

        }
        int numOfIngredients = Integer.parseInt(input[INITAL_IDX]);
        String units = input[LOWER_IDX];
        UnitsArr = units.split(SPACE);
        String ingredients = input[SECOND_IDX];
        totIngrdientsArr = ingredients.split(SPACE);

        size = UnitsArr.length;
        int[] specifiedArrayOfUnits = convertToIntegerArray(UnitsArr);
        int[] totIngredientInLabArray = convertToIntegerArray(totIngrdientsArr);
        for (int i = 0; i < size; i++) {
            totIngredientInLabArray[i] = Integer.parseInt(totIngrdientsArr[i]);
        }

        for (int i = 0; i < numOfIngredients; i++) {
            maxPowerPuffGirlsCreationList.add(totIngredientInLabArray[i] / specifiedArrayOfUnits[i]);
        }
        System.out.println(Collections.min(maxPowerPuffGirlsCreationList));

    }
    /**
     * This method validates the first input 
     * @param noOfIngredients
     * @return boolean
     */
    private static boolean validateIngredienInput(String noOfIngredients) {
        int numOfIngredients = Integer.parseInt(noOfIngredients);
        boolean result = false;
        if (numOfIngredients <= LOWER_IDX && numOfIngredients <= UPPER_IDX) {
            result = true;
            return result;
        }
        return result;
    }

    /**
     * This utility method convert the String array to Integer array
     * @param size
     * @param specifiedArrayOfUnits
     * @return int[]
     */
    private static int[] convertToIntegerArray(String[] arrayToBeParsed) {
        int array[] = new int[size];
        for (int i = INITAL_IDX; i < size; i++) {
            array[i] = Integer.parseInt(arrayToBeParsed[i]);
        }
        return array;
    }
}

Вышеупомянутое решение прошло 3 тестовых примера, остальные 7 не идентифицированы. Пожалуйста, помогите мне исправить или улучшить этот код.

1 Ответ

4 голосов
/ 09 мая 2020

Есть несколько проблем с вашим кодом:

try {
    for (int i = 0; i < input.length; i++) {
        input[i] = stdin.nextLine();
        if (validateIngredienInput(input[INITAL_IDX])) {
            System.exit(INITAL_IDX);
        }
    }
} finally {
    stdin.close();
}

Вам не нужно проверять первую строку каждый раз, когда вы читаете одну строку из ввода. Вместо этого вы запускаете тест только один раз. Вы можете запустить его, как только прочитаете первую строку или после того, как прочитаете весь ввод. Код может выглядеть так:

for (int i = 0; i < input.length; i++) {
    input[i] = stdin.nextLine();
}
if (!validateIngredienInput(input[INITAL_IDX])) {
    System.exit(...);
}

Также не ясно, что означает возвращаемое значение validateIngredienInput(). true правильный ввод или false? Ваши операторы if() проверяют, является ли возвращаемое значение true, и завершают работу, если это так.

private static boolean validateIngredienInput(String noOfIngredients)
{
    int numOfIngredients = Integer.parseInt(noOfIngredients);
    boolean result = false;
    if (numOfIngredients <= LOWER_IDX && numOfIngredients <= UPPER_IDX) {
        result = true;
        return result;
    }
    return result;
}

Ваше условие if() не имеет никакого смысла. Вы проверяете, равно ли количество различных ингредиентов <= 0 и <= 1. Это также означает, что вы можете переписать его как if (numOfIngredients <= 0). Но из приведенного выше описания неясно, должна ли проверка возвращать true или false. В зависимости от того, что должен делать этот метод, его можно записать как:

private static boolean validateIngredienInput(String noOfIngredients)
{
    int numOfIngredients = Integer.parseInt(noOfIngredients);
    return numOfIngredients > 0;
}

Это вернет истину, если значение больше 0.

UnitsArr = units.split(SPACE);

Имена переменных и полей должны начинаться с нижнего регистра, чтобы их не путали с именами классов, которые начинаются с верхнего регистра. Похоже, что UnitsArr - это класс, но на самом деле это поле. Итак, вы должны переименовать свое поле в unitsArr:

unitsArr = units.split(SPACE);

Также проверьте требования / формат ввода и ограничения:

Constraints
1<= N <=10000000 (1e7)
0<= Quantity_of_ingredient <= LLONG_MAX 

Как вы см. количество ингредиента может иметь значение long, но вы используете массивы Integer.parseInt() и int[] для хранения количества. Вы должны изменить это на long, чтобы читать long значений из ввода.

int[] totIngredientInLabArray = convertToIntegerArray(totIngrdientsArr);
for (int i = 0; i < size; i++) {
   totIngredientInLabArray[i] = Integer.parseInt(totIngrdientsArr[i]);
}

Вы конвертируете массив String в массив int с помощью вашего помощника метод convertToIntegerArray(), но затем вы делаете это снова с for l oop. Вы можете пропустить один из двух.

Вы также можете проверить по адресу: Что такое отладчик и как он может помочь мне в диагностике проблем?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...