Доброго времени суток. Бьюсь уже какую неделю над задачей, просто уснуть не дает. Все никак не могу прийти к алгоритму который валидатор сумеет проверить.
Итак что конкретно происходит:
Беру первоначальный список, и удаляю из него все рекламы, которые превышают общее время заказа по времени, и с нулевым hits. Отдаю в функцию полученый лист.
Функция(setBestList):
Проверяем есть ли у нас уже какая-нибудь определенная комбинация:
Если нет:
Проверяем что общее время реклам < общего времени готовки.
Если да - запоминаем как лучшую комбинацию. Запоминаем ее параметры(Время прокрутки, цены, кол-во реклам в блоке)
Если нет - Для каждого элемента листа вызываем setBestList, передавая в него тот же лист, но с удаленным текущим элементом.
Если есть уже определенный "лучший набор":
Проверяем что текущий лист лучше чем "лучший набор"(по условию, сверяем стоимость рекламы>время прокрутки>количество реклам в блоке). Если текущий лист лучше "лучшего листа" то проверяем пройдет ли по времени заказа. Если да => переопределяем "лучший набор" Запоминаем его параметры. Если нет => опять начинаем рекусивно крутить удаляя по элементу и вызывая эту же функцию.
Полученый результат сортирую выдачу по условию.
На домашней машине все работает мгновенно на ростер из 10+ реклам с нарандомлеными параметрами.
Я не знаю сколько они там кидают в джавараше нагруз, но я официально сдаюсь. Сижу над этой задачей уже месяц. Я уже не знаю куда алгоритм оптимизировать.
package com.javarush.task.task27.task2712;
import com.javarush.task.task27.task2712.ad.Advertisement;
import com.javarush.task.task27.task2712.ad.AdvertisementManager;
import com.javarush.task.task27.task2712.ad.NoVideoAvailableException;
import com.javarush.task.task27.task2712.kitchen.Order;
import javafx.beans.InvalidationListener;
import java.io.IOException;
import java.util.Observable;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Tablet extends Observable {
static Logger logger = Logger.getLogger(Tablet.class.getName());
final int number;
public Tablet(int number) {
this.number = number;
}
public Order createOrder(){
try {
Order order = new Order(this);
if (!order.isEmpty()) {
ConsoleHelper.writeMessage(order.toString());
setChanged();
notifyObservers(order);
AdvertisementManager manager = new AdvertisementManager(order.getTotalCookingTime() * 60);
try {
manager.processVideos();
} catch (NoVideoAvailableException e) {
logger.log(Level.INFO,"No video is available for the order " +order);
}
}else {ConsoleHelper.writeMessage("Заказ пуст");}
return order;
} catch (IOException e) {
logger.severe("Console is unavailable.");
return null;
}
}
@Override
public String toString() {
return String.format("Tablet{number=%d}",number);
}
}