Помогите, товарищи. Никак не хочет приниматься.

Задание 10
Рекурсию используют тогда, когда алгоритм решения задачи совпадает с алгоритмом решения подзадачи (части).
У нас как раз такой случай. Нам нужно сделать полный перебор всех вариантов и выбрать из них лучший.

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

Текущее задание - реализовать п.2.2. предыдущего задания с помошью рекурсии.
(подобрать список видео из доступных, просмотр которых обеспечивает максимальную выгоду)
Рекурсивный метод должен выбрать набор рекламных роликов, которые будут показаны посетителю.

Этот набор должен удовлетворять следующим требованиям:
1) сумма денег, полученная от показов, максимальная из всех возможных вариантов
2) общее время показа рекламных роликов НЕ должно превышать время приготовления блюд для текущего заказа
3) для одного заказа любой видео-ролик показывается не более одного раза
4) если существуют несколько вариантов набора видео-роликов с одинаковой суммой денег, полученной от показов, то:
4.1) выбрать тот вариант, у которого суммарное время максимальное
4.2) если суммарное время у этих вариантов одинаковое, то выбрать вариант с минимальным количеством роликов
5) количество показов у любого рекламного ролика из набора - положительное число

При локальном тестировании учитывайте, что необходимо отобразить все рекламные ролики, отобранные для показа,
в порядке уменьшения стоимости показа одного рекламного ролика в копейках.

На всякий случай вот еще задание 9

Задание 9
Нам понадобится исключение, которое поможет обработать ситуацию, если у нас не будет получаться подобрать рекламные ролики.
1. Создадим unchecked NoVideoAvailableException в пакете ad.

2. Разберем подробно метод void processVideos() в AdvertisementManager.
2.1. Удаляем из него вывод в консоль "processVideos method calling"
Метод должен:
2.2. Подобрать список видео из доступных, просмотр которых обеспечивает максимальную выгоду. (Следующее задание)
2.3. Если нет рекламных видео, которые можно показать посетителю, то бросить NoVideoAvailableException,
которое перехватить в оптимальном месте (подумать, где это место) и с уровнем Level.INFO логировать фразу
"No video is available for the order " + order
2.4. Отобразить все рекламные ролики, отобранные для показа, в порядке уменьшения стоимости показа одного рекламного ролика
в копейках. Вторичная сортировка - по увеличению стоимости показа одной секунды рекламного ролика в тысячных частях копейки
Используйте метод Collections.sort
(Будет тестироваться вместе со следующим заданием)
Пример для заказа [Water]:
First Video is displaying... 50, 277
где First Video - название рекламного ролика
где 50 - стоимость показа одного рекламного ролика в копейках
где 277 - стоимость показа одной секунды рекламного ролика в тысячных частях копейки (равно 0.277 коп)
Используйте методы из класса Advertisement.
2.5. В классе Advertisement создайте метод void revalidate(). Этот метод должен:
2.5.1. кидать UnsupportedOperationException, если количество показов не положительное число
2.5.2. уменьшать количество показов
2.6. Для каждого показанного рекламного ролика пересчитать его данные вызвав метод revalidate() у объекта класса Advertisement.

AdvertisementManager

package com.javarush.test.level27.lesson15.big01.ad;

import com.javarush.test.level27.lesson15.big01.ConsoleHelper;

import java.util.*;

public class AdvertisementManager
{
    private final AdvertisementStorage storage = AdvertisementStorage.getInstance();

    private int timeSeconds;

    public void processVideos() {
        if(storage.list().isEmpty())
            throw new NoVideoAvailableException();
        List<Advertisement> list = getList();
        if(list.isEmpty())
            throw new NoVideoAvailableException();
        Collections.sort(list, new Comparator<Advertisement>()
        {
            @Override
            public int compare(Advertisement o1, Advertisement o2)
            {
                long am1 = o1.getAmountPerOneDisplaying(), am2 = o2.getAmountPerOneDisplaying();
                return am2 == am1 ? Long.compare(1000*am1/o1.getDuration(), 1000*am2/o2.getDuration()) : Long.compare(am2, am1);
            }
        });
        for (Advertisement advert : list)
        {
            long amount = advert.getAmountPerOneDisplaying();
            ConsoleHelper.writeMessage(String.format("%s is displaying... %d, %d", advert.getName(), amount,
                    1000*amount/advert.getDuration()));
            try
            {
                advert.revalidate();
            }
            catch (Exception e) {}
        }
    }

    private Set<List<Advertisement>> getSet(List<Advertisement> set, int index, ArrayList<Advertisement> subset) //метод, выбирающий все возможные комбинации у storage.list() {
        Set<List<Advertisement>> subsets = new HashSet<>();

        if(index == set.size()){
            subsets.add(new ArrayList<>(subset));
            return subsets;
        }

        subsets.addAll(getSet(set, index + 1, subset));
        subset.add(set.get(index));
        subsets.addAll(getSet(set, index + 1, subset));
        subset.remove(subset.size()-1);
        return subsets;
    }

    private List<Advertisement> getList() //метод, который выбирает лучший лист{
        Set<List<Advertisement>> set = getSet(storage.list(), 0, new ArrayList<Advertisement>());
        Iterator<List<Advertisement>> it = set.iterator();
       while (it.hasNext()) { //сначала отсеиваем листы, содержащие Advertisement с hits <=0, либо слишком длинные по времени
        List<Advertisement> next = it.next();
        int time = 0;
        for (Advertisement ad : next)
        {
            if(ad.getHits() <= 0) {
                it.remove();
                break;
            }
            time += ad.getDuration();
            if(time > timeSeconds)
            {
                it.remove();
                break;
            }
          }
        }
        return Collections.max(set, new Comparator<List<Advertisement>>() //пункты задания 1 и 4
        {
            @Override
            public int compare(List<Advertisement> o1, List<Advertisement> o2)
            {
                long price1 = price(o1), price2 = price(o2);
                if(price1 != price2) return Long.compare(price1, price2);
                int duration1 = duration(o1), duration2 = duration(o2);
                if(duration1 != duration2) return duration1 - duration2;
                return o2.size() - o1.size();
            }
        });
    }

    private long price(List<Advertisement> list) {
        long res = 0;
        for (Advertisement advert : list)
            res += advert.getAmountPerOneDisplaying();
        return res;
    }

    private int duration(List<Advertisement> list) {
        int res = 0;
        for (Advertisement advert : list)
            res += advert.getDuration();
        return res;
    }

    public AdvertisementManager(int timeSeconds)
    {
        this.timeSeconds = timeSeconds*60;
    }
}

Advertisement

package com.javarush.test.level27.lesson15.big01.ad;

public class Advertisement
{
    private Object content;
    private String name;
    private long initialAmount;
    private int hits;
    private int duration;
    private long amountPerOneDisplaying;

    public void revalidate() {
        if(hits <= 0)
            throw new UnsupportedOperationException();
        hits--;
    }

    public int getHits()
    {
        return hits;
    }

    public String getName()
    {
        return name;
    }

    public int getDuration()
    {
        return duration;
    }

    public long getAmountPerOneDisplaying()
    {
        return amountPerOneDisplaying;
    }

    public Advertisement(Object content, String name, long initialAmount, int hits, int duration)
    {
        this.content = content;
        this.name = name;
        this.initialAmount = initialAmount;
        this.hits = hits;
        this.duration = duration;
        amountPerOneDisplaying = initialAmount/hits;
    }
}

AdvertisementStorage

package com.javarush.test.level27.lesson15.big01.ad;

import java.util.ArrayList;
import java.util.List;

class AdvertisementStorage
{
    private static AdvertisementStorage ourInstance = new AdvertisementStorage();

    public static AdvertisementStorage getInstance()
    {
        return ourInstance;
    }

    private final List<Advertisement> videos = new ArrayList<>();

    public List<Advertisement> list()
    {
        return videos;
    }

    public void add(Advertisement advertisement) {
        videos.add(advertisement);
    }

    private AdvertisementStorage()
    {
        add(new Advertisement(new Object(), "First Video", 5000, 100, 3 * 60)); // 3 min
        add(new Advertisement(new Object(), "Second Video", 100, 10, 15 * 60)); //15 min
        add(new Advertisement(new Object(), "Third Video", 400, 2, 10 * 60));   //10 min
    }
}

задан 06 Ноя '16, 07:36

feden's gravatar image

feden
634
одобрено: 13%

закрыто 13 Сен, 16:26

AndyRad's gravatar image

AndyRad
13.1k29

все еще актуально!

(07 Ноя '16, 07:10) feden

Вопрос был закрыт по следующей причине: "Problem is not reproducible or outdated" AndyRad 13 Сен, 16:26


Псс… Парни У кого есть решенное 8 или 9 задание?

Скиньте плиз (со ВСЕМИ классами). Застрял на 9м задании.

Перепробовал 100500 вариантов. Видать где то что то изменил так, что даже при привальном выполнении задания, сервак не пропустит из за изменённых других классов.

nekl08@gmail.com.

В вообще было бы отлично, если бы сообщали причину непринятия задачи. Ну или хотя бы какой класс им не приглянулся )

ссылка

опубликован 09 Ноя '16, 11:05

nekl08's gravatar image

nekl08
111
одобрено: 0%

Всем спасибо, решено.

Нужно было лишь добавить модификатор public этому методу void revalidate().

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

еще добавил в метод processVideos() throws NoVideoAvailableExceptionUnsupportedOperationException, UnsupportedOperationException

раньше из него выскакивали только такие NoVideoAvailableExceptionUnsupportedOperationException исключения

Оказывается прогресс большой задачи можно сбросить. В идеи в окне выбора задачи, на большой задаче можно нажать правую кнопку мыши и выскочит менюшка, в которой есть пункт - сбросить прогресс по задаче.

ссылка

опубликован 10 Ноя '16, 07:56

nekl08's gravatar image

nekl08
111
одобрено: 0%

Следить за вопросом

По Email:

После авторизации вы сможете подписаться на любые обновления здесь

Основы Markdown

  • *italic* or _italic_
  • **bold** or __bold__
  • ссылка:[текст](http://url.com/ "заголовок")
  • изображение?![alt текст](/path/img.jpg "заголовок")
  • нумерованный список: 1. Foo 2. Bar
  • Для того чтобы добавить разрыв строки просто добавьте два пробела.
  • основные HTML тэги, также поддерживаются

Тэги:

×3,805
×47
×39
×16

Задан: 06 Ноя '16, 07:36

Просмотров: 367 раз

Отредактирован: 13 Сен, 16:26