Как правильно считать выделенную память - PullRequest
2 голосов
/ 01 февраля 2020

У меня есть эта задача:

Предположим, что помимо коэффициента масштабирования существует фактор, отвечающий за освобождение ненужной памяти после удаления элементов из списка. Вам будут даны два фактора: один для увеличения и один для уменьшения выделенной памяти. После этого будут запросы на абстрактное добавление и удаление кластеров элементов. Ваша задача - вернуть выделенную память для каждого запроса 'count' в этот момент.

Умножение на дробь округляется в большую сторону, деление на дробь округляется в меньшую сторону.

Первоначально выделенная память равна 2.

Входные данные: в первой строке содержится ряд запросов и коэффициенты масштабирования (≥1.1) и уменьшения (≥1.1).

Далее следуют запросы следующих типов: add count; удалить счетчик; count.

Вывод: Для каждого запроса 'count' запишите количество выделенной памяти на данный момент.

Вход 1:

3 2.0 2.0

добавить 100

удалить 50

count

Выход 1:

64

Ввод 2:

12 1.1 1.1

добавить 10000

удалить 500

считать

добавить 255342

удалить 255

считать

добавить 243

удалить 2435

считать

добавить 666554

удалить 346

count

К сожалению, я не знаю, какой вывод должен быть для test2. Мой код работает правильно с test1, но он терпит неудачу с test2. Может кто-нибудь мне помочь? Может быть проблема с округлением, может быть и нет.

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int queryNumber = scanner.nextInt();
        double upScalingFactor = scanner.nextDouble();
        double downScalingFactor = scanner.nextDouble();

        int allocatedMemory = 2;
        int numOfElementsToStore = 0;

        for (int i = 0; i < queryNumber; i++) {
            String operationType = scanner.next();

            switch (operationType) {
                case "add":
                    int amountToAdd = scanner.nextInt();
                    numOfElementsToStore += amountToAdd;

                    while (allocatedMemory <= numOfElementsToStore) {
                        allocatedMemory = (int) Math.ceil(allocatedMemory * upScalingFactor);
                    }
                    break;
                case "delete":
                    int amountToSubtract = scanner.nextInt();
                    numOfElementsToStore -= amountToSubtract;

                    while (Math.floor(allocatedMemory / downScalingFactor) >= numOfElementsToStore) {
                        allocatedMemory = (int) Math.floor(allocatedMemory / downScalingFactor);
                    }
                    break;
                case "count":
                    System.out.println(allocatedMemory);
                    break;
            }
        }
    }
}

1 Ответ

0 голосов
/ 01 февраля 2020

Вы не должны разыгрывать умножение / деление результата внутри, пока l oop. И всегда используйте Math.floor().

Правильно Выход для Вход 2 :

9660
271469
271469
937184
...