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