Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите решить задачку (https://javascript.ru/forum/misc/82542-pomogite-reshit-zadachku.html)

vurdalak21 22.05.2021 17:52

Помогите решить задачку
 
Вложений: 2
Помогите решить задачку через циклы(for) и условия(if)

рони 22.05.2021 17:59

Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

vurdalak21 22.05.2021 20:06

рони,
There is a special kind of apple tree that grows apples every day for n days. On the ith day, the tree grows apples[i] apples that will rot after days[i] days, that is on day i + days[i] the apples will be rotten and cannot be eaten. On some days, the apple tree does not grow any apples, which are denoted by apples[i] == 0 and days[i] == 0.

You decided to eat at most one apple a day (to keep the doctors away). Note that you can keep eating after the first n days.

Given two integer arrays days and apples of length n, return the maximum number of apples you can eat.

Пример 1:

Input: apples = [1,2,3,5,2], days = [3,2,1,4,2]
Output: 7
Пояснение: вы можете съесть 7 яблок:
- В первый день вы едите яблоко. которые выросли в первый день.
- На второй день вы едите яблоко, которое выросло на второй день.
- На третий день вы едите яблоко, которое выросло на второй день. После этого дня яблоки, выросшие на третий день, загнивают.
- С четвертого по седьмой день вы едите яблоки, выросшие на четвертый день.
Пример 2:

Input: apples = [3,0,0,0,0,2], days = [3,0,0,0,0,2]
Output: 5
Пояснение: Вы можете съесть 5 яблок:
- С первого по на третий день вы едите яблоки, выросшие в первый день.
- Ничего не делайте в четвертый и пятый дни.
- На шестой и седьмой день вы едите яблоки, выросшие на шестой день.


let eatenApples = function(apples, days) {
    const arr = [];
    let totalApple = 0;
    
    for(let i = 0; i < apples.length; i++) {
        arr.push([i + days[i], apples[i]]);
        
        totalApple++;
        
    }
    
    return totalApple;
};

рони 22.05.2021 20:10

vurdalak21,
за развёрнутое пояснение спасибо, жаль пока не могу ничем помочь, не понимаю условия задачи.

рони 22.05.2021 21:42

vurdalak21,
let eatenApples = function(apples, days) {
    let totalApple = 0;
    let current = 0;
    for (let k of days) {
        if (!k) k = 1;
        for (let i = 0; i < k; i++) {
            let index = apples.findIndex((a, i) => i <= current && i > current - 3 && a);
            if (index !== -1) {
                totalApple++;
                apples[index]--
            }
            current++;
        }
    }
    return totalApple;
};
let apples = [1, 2, 3, 5, 2], days = [3, 2, 1, 4, 2];
console.log(eatenApples(apples, days)) // 7
apples = [3, 0, 0, 0, 0, 2], days = [3, 0, 0, 0, 0, 2]
console.log(eatenApples(apples, days)) // 5

vurdalak21 23.05.2021 10:30

рони,
спасибо

Alexandroppolus 23.05.2021 10:55

рони,
На [6, 1, 1], [16, 1, 1] должно быть 8, а получается 5.

Тут явно задачка на приоритетную очередь (можно взять двоичную кучу, поскольку количество элементов известно). Каждый день определяем дату протухания очередной порции, и засовываем пару {count, expire} в очередь, так что первым элементом будет пара с минимальным expire. Пока оный expire меньше текущего дня, удаляем. В итоге наверху останется минимальный, но ещё годный expire. Из неё и забираем яблочко, а если count обнулился, тоже удаляем. Сложность O(N*ln(N))

Доберусь до компа, напишу говнокод.

рони 23.05.2021 11:00

Цитата:

Сообщение от Alexandroppolus
должно быть 8, а получается 5.

яблоки у них червивые, есть невозможно)))
из любого количества яблок в день, максимум что можно съесть это 3, остальное по условию сгнивает.
[6, 1, 1] => [3, 1, 1] => 5

Alexandroppolus 23.05.2021 12:35

Цитата:

Сообщение от рони
из любого количества яблок в день, максимум что можно съесть это 3

Что-то не нашёл такого поинта в условии..

рони 23.05.2021 14:07

Alexandroppolus,
Цитата:

that is on day i + days[i] the apples will be rotten and cannot be eaten.
возможно я неправильно понял условия задачи

Alexandroppolus 24.05.2021 10:22

Запилил решение. Вспомнил реализацию heap :)

function eatenApples(counts, days) {
  if (!counts || !counts.length) {
    return 0
  }
  let result = 0
  const heap = createHeap(counts.length, (a, b) => a.expire < b.expire)
  for (let day = 0; day < counts.length || heap.getLength(); ++day) {
    // выкидываем устаревшие
    while (heap.getLength() && heap.getTop().expire <= day) {
      heap.pop()
    }
    const count = day < counts.length ? counts[day] : 0
    if (count > 0) {
      // если есть новая порция, добавляем в очередь
      heap.push({ count, expire: day + Math.max(days[day], 1) })
    }
    // если очередь не пустая, берем одно из корзины с самыми скоропортящимися
    const top = heap.getTop()
    if (top) {
      result++
      top.count--
      // если оная корзина опустела, выкидываем
      if (top.count < 1) {
        heap.pop()
      }
    }
  }
  return result
}

alert([
  eatenApples([1,2,3,5,2], [3,2,1,4,2]),
  eatenApples([3,0,0,0,0,2], [3,0,0,0,0,2]),
  eatenApples([6, 1, 1], [16, 1, 1])
].join('\n'));

//--------------------------------------------------------
// heap
function createHeap(maxSize, fnIsPrior) {
  const arr = new Array(maxSize)
  let length = 0
  return {
    getLength() {
      return length
    },
    getTop() {
      return length ? arr[0] : undefined
    },
    push(data) {
      if (length === maxSize) {
        return
      }
      let i = length
      for (let p = Math.floor((i - 1) / 2); i > 0 && fnIsPrior(data, arr[p]); i = p, p = Math.floor((p - 1) / 2)) {
        arr[i] = arr[p]
      }
      arr[i] = data
      length++
    },
    pop() {
      if (!length) {
        return undefined
      }
      const r = arr[0]
      length--
      const value = arr[length]
      arr[length] = undefined
      if (length) {
        let i = 0
        while (true) {
          let childIdx = i * 2 + 1
          if (childIdx < length) {
            if (childIdx + 1 < length && fnIsPrior(arr[childIdx + 1], arr[childIdx])) {
              childIdx++
            }
            if (fnIsPrior(arr[childIdx], value)) {
              arr[i] = arr[childIdx]
              i = childIdx
            } else {
              break
            }
          } else {
            break
          }
        }
        arr[i] = value
      }
      return r
    }
  }
}

vurdalak21 25.05.2021 21:08

рони,
подскажите, а как перерешать эту задачу в функциональном стиле?
какими методами необходимо воспользоваться для решения

рони 25.05.2021 21:57

Цитата:

Сообщение от Alexandroppolus
Запилил решение

:)

рони 25.05.2021 22:05

vurdalak21,
не могу подсказать , судя по предложенному коду от Alexandroppolus, я и саму задачу и её решение не особо понимаю)))


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