Давайте начнем с этой части:
if (edibleFruits < numStomach) {
edibleFruits += fruitWeight[i];
fruitAmount++;
}
if (edibleFruits > numStomach) {
edibleFruits -= fruitWeight[i];
}
Вы забудете сделать fruitAmount--
, когда Милслав переедает. Хотя я бы порекомендовал заменить его на:
if (edibleFruits + fruitWeight[i] <= numStomach) {
edibleFruits += fruitWeight[i];
fruitAmount++;
}
Это более компактно.
Следующая часть:
for (int i = 0; i< vecSize; i++)
{
if (edibleFruits < numStomach)
{
edibleFruits += fruitWeight[i];
fruitAmount++;
}
if (edibleFruits > numStomach)
{
edibleFruits -= fruitWeight[i];
}
}
Вы всегда начинаете есть с первых фруктов и это не всегда оптимально. Вы можете начать есть, начиная с любых фруктов. Например, ввод будет следующим:
3 100
100 50 1
С вашим текущим кодом вы съедите 100
фруктов и пропустите все следующие. Таким образом, ваш ответ будет: 1
, а правильный ответ - 2
. Потому что вы можете начать есть со второго фрукта и есть 50
и 1
.
Самый простой способ решить его - это иметь 2 цикла for, где первый будет перебирать начальный индекс, с которого начнется Milslav есть. И следующий l oop будет повторяться до конца. Максимальное количество фруктов, съеденных общих стартовых показателей, является ответом. Например:
for (int start_eat_from = 0; start_eat_from < N; ++start_eat_from) {
for (int i = start_eat_from; i < N; ++i) {
//Eat everything if Milslav can and check that he ate the maximum amount.
}
}
Это сработает, потому что будет только 10^6
итераций, и оно будет завершено за 1 секунду.
Если N
больше, чем оно было бы необходимо использовать некоторое динамическое программирование.
UPD:
В целом код будет выглядеть так:
for (int start_from = 0; start_from < numFruits; ++start_from) {
edibleFruits = 0;
int tmpFruitAmount = 0;
for (int i = start_from; i < numFruits; ++i) {
if (edibleFruits + fruitWeight[i] <= numStomach) {
edibleFruits += fruitWeight[i];
tmpFruitAmount++;
}
}
fruitAmount = max(fruitAmount, tmpFruitAmount);
}