Помогите решить задачку
Вложений: 2
Помогите решить задачку через циклы(for) и условия(if)
|
Пожалуйста, отформатируйте свой код!
Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [html run] ... минимальный код страницы с вашей проблемой [/html] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
рони,
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;
};
|
vurdalak21,
за развёрнутое пояснение спасибо, жаль пока не могу ничем помочь, не понимаю условия задачи. |
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
|
рони,
спасибо |
рони,
На [6, 1, 1], [16, 1, 1] должно быть 8, а получается 5. Тут явно задачка на приоритетную очередь (можно взять двоичную кучу, поскольку количество элементов известно). Каждый день определяем дату протухания очередной порции, и засовываем пару {count, expire} в очередь, так что первым элементом будет пара с минимальным expire. Пока оный expire меньше текущего дня, удаляем. В итоге наверху останется минимальный, но ещё годный expire. Из неё и забираем яблочко, а если count обнулился, тоже удаляем. Сложность O(N*ln(N)) Доберусь до компа, напишу говнокод. |
Цитата:
из любого количества яблок в день, максимум что можно съесть это 3, остальное по условию сгнивает. [6, 1, 1] => [3, 1, 1] => 5 |
Цитата:
|
Alexandroppolus,
Цитата:
|
Запилил решение. Вспомнил реализацию 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,
не могу подсказать , судя по предложенному коду от Alexandroppolus, я и саму задачу и её решение не особо понимаю))) |
| Часовой пояс GMT +3, время: 09:54. |