Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите разобрать задание (https://javascript.ru/forum/misc/80836-pomogite-razobrat-zadanie.html)

Marson 11.08.2020 18:12

Помогите разобрать задание
 
Есть набор чисел в массиве, который представляет количество
последовательных дней возможного бронирования квартиры, Вы в качестве
арендодателя хотите выбрать последовательность, которая максимизирует
количество дней пребывания, однако Вам нужно как минимум 1-дневный
перерыв между бронированиями для уборки. Написать ф-цию нахождения. Пример:
[7, 1, 2, 5] => 12
7 => Авг 1 - Авг 7
1 => Авг 7 - Авг 8
2 => Авг 8 - Авг 10
5 => Авг 10 - Авг 15

[3, 6, 4] => 7
[4, 10, 3, 1, 5] => 15
подаем на вход [2, 4, 4, 3, 3] => получаем 9

Не могу понять какой алгоритм должен быть, чтобы вывести 12, 7, 15, 9

рони 11.08.2020 18:53

Цитата:

Сообщение от Marson
какой алгоритм должен быть, чтобы вывести 12, 7, 15, 9

создать все возможные варианты и выбрать с максимальной суммой элементов.
[7, 1, 2, 5] => 12

[0, 1, 0, 5] 1 + 5 = 6
[7, 0, 0, 5] 7 + 5 = 12!
[7, 0, 2, 0] 7 + 2 = 9

[3, 6, 4] => 7

[3, 0, 4] 3 + 4 = 7!
[0, 6, 0] 6

тоже самое
[4,6,3] =>7
[0,6,0] = 6
[4,0,3] 4 + 3 =7!

Marson 11.08.2020 19:00

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


мне кажется не так вы пишете должно быть. Как объяснить этот пример [4,6,3]=>7?

рони 11.08.2020 19:08

Цитата:

Сообщение от Marson
Как объяснить этот пример [4,6,3]=>7?

смотрите пост #2 добавлено

Marson 11.08.2020 19:44

а этот [2, 4, 4, 3, 3] => получаем 9, вот так [2, 0, 4, 0, 3] => 9?

рони 11.08.2020 19:48

Цитата:

Сообщение от Marson
вот так [2, 0, 4, 0, 3] => 9?

да

рони 11.08.2020 19:55

Marson,
не самый оптимальный вариант ...
const maxSumm = arr => {
    if(arr.length < 2) return Math.max(...arr, 0);
    let temp = [[0, arr[1]], [arr[0], 0]],
        up = [];
    for (let i = 2; i < arr.length; i++) {
        up = [];
        temp = temp.map(ar => {
            let last = ar[ar.length - 1],
                prev = ar[ar.length - 2];
            if (last) ar.push(0);
            else if (prev) {
                up.push([...ar, 0]);
                ar.push(arr[i])
            } else ar.push(arr[i])
            return ar
        });
        temp = temp.concat(up)
    }
    temp = temp.map(a => a.reduce((a, b) => a + b));
    return Math.max(...temp);
}
alert(maxSumm([4, 10, 3, 1, 5]))

Marson 11.08.2020 22:11

Я просто не понимаю смысл задания. Нужно найти последовательность, которая максимизирует
количество дней пребывания?

Marson 11.08.2020 22:15

Спасибо за код конечно же, но мне нужно свой написать, это с конторы тз прислали, а копипастить это не то)

laimas 12.08.2020 02:12

Цитата:

Сообщение от Marson
Я просто не понимаю смысл задания.

Я тоже, почему:

[7, 1, 2, 5] => 12
7 => Авг 1 - Авг 7
1 => Авг 7 - Авг 8
2 => Авг 8 - Авг 10
5 => Авг 10 - Авг 15

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

Marson 12.08.2020 02:54

Это задание для для тех, кто на работу в скором времени хочет устроиться, для начинающих в общем

laimas 12.08.2020 03:36

Цитата:

Сообщение от Marson
Это задание для для тех, кто на работу в скором времени хочет устроиться

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

Есть заказчики, которые знают, что "хотят", но не могут толком объяснить этого и приходится все из них вытягивать, либо решать что-то исходя из своих представлений.

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

Marson 13.08.2020 04:36

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

Marson 13.08.2020 15:39

По какому принципу этот алгоритм нужно написать, ведь есть же где два пропуска, а есть где один? Рони, можете дописать объяснение к вашему коду пожалуйста

рони 13.08.2020 16:15

Цитата:

Сообщение от Marson
По какому принципу этот алгоритм нужно написать, ведь есть же где два пропуска, а есть где один? Рони, можете дописать объяснение к вашему коду пожалуйста

смотрим текущий массив
если последний элемент не ноль добавляем ноль,
строка 10 if (last) ar.push(0);
если последние элементы ноль ноль добавляем элемент из первоначального массива,
строка 14 else ar.push(arr[i])
если последние элементы не ноль и ноль создаём дубликат и добавляем ноль, к текущему массиву добавляем элемент из первоначального массива.
строка 12
else if (prev) {
up.push([...ar, 0]);
ar.push(arr[i])
}
весь алгоритм.

Alexandroppolus 16.08.2020 22:36

Похоже, задача на динамическое программирование.
Алгоритм примерно такой:
function maxSum(arr) {
  var memo = [0, 0];
  function maxSumR(len) {
    if (len < 2) {
      return len ? arr[0] : 0;
    } else {
      if (memo[len]) {
        return memo[len];
      } else {
        return memo[len] = Math.max(maxSumR(len - 1), arr[len - 1] + maxSumR(len - 2));
      }
    }
  }
  return maxSumR(arr.length);
}

alert(maxSum([4, 10, 3, 1, 5]));


Компа под рукой нет, не дебажил. Но в целом всё стандартно - сведение задачи n элементов к задаче для n-1 или n-2, плюс мемоизация, так что должно по идее за линейное время, если не ошибаюсь. Предполагается, что отрицательных чисел нет. Здесь вычисляется только сумма, а если надо индексы чисел, то придется допиливать.

Alexandroppolus 16.08.2020 23:06

Пожалуй, тут без рекурсии можно, тогда не понадобится расходовать память на мемоизацию. Всё просто, в общем. Вот вариант, где по сути делается то же самое.

function maxSum(a) {
  if (!a || !a.length) {
    return 0;
  }
  var x = 0, y = a[0];
  for (var i = 1; i < a.length; ++i) {
    var t = y;
    y = Math.max(x + a[i], y);
    x = t;
  }
  return y;
}

alert(maxSum([3, 20, 8]));
alert(maxSum([4, 10, 3, 1, 5]));


Часовой пояс GMT +3, время: 11:02.