Я пытаюсь решить проблему: 1833. Максимальное количество батончиков мороженого из Leetcode:
Это душный летний день, и мальчик хочет купить мороженое бары. В магазине есть n баров с мороженым. Вам дан массив затраты длины n, где cost[i] — цена i-го мороженого бар в монетах. У мальчика изначально есть монеты, которые он может потратить, и он хочет купить как можно больше батончиков мороженого. Вернуть максимальное число батончиков мороженого мальчик может купить за монеты.
Примечание: мальчик может покупать мороженое в любом порядке.
Пример 1:
Ввод: стоимость = [1,3,2,4,1], монеты = 7
Выход: 4
Пояснение: мальчик можно купить батончики мороженого по индексам 0,1,2,4 на общую сумму 1+3+ 2 + 1 = 7.
Я использую цикл while и в коде следующим образом:
class Solution {
public:
int maxIceCream(vector<int>& costs, int coins) {
long long int count = 0;
sort(costs.begin(), costs.end());
int i = 0;
while(coins > 0 && i < costs.size())
{
count++;
coins -= costs[i];
i++;
}
return coins;
}
};
Я получаю следующую ошибку. Может кто-нибудь помочь, почему я получаю это? Код отлично работает с циклом for. Строка 12: Char 19: ошибка выполнения: переполнение целого числа со знаком: 1094795588 - -1094795586 не может быть представлено в типе 'int' (solution.cpp) СВОДКА: UndefinedBehaviorSanitizer: неопределенное поведение prog_joined.cpp:21:19
Ограничения даны следующим образом:
costs.length == n
1 <= n <= 10^5
1 <= costs[i] <= 10^5
1 <= coins <= 10^8
почему есть count и i ? Если все пойдет хорошо, они должны иметь одинаковое значение
вам нужно написать свои собственные тесты. Вам нужно запустить код в вашей локальной среде, где вы можете подключить отладчик. Так исправляют ошибки. Вы не исправляете ошибки, позволяя кому-то другому выполнять компиляцию и тестирование за вас. Онлайн-судьи по коду созданы для того, чтобы не давать вам знать, как исправить ваш код, но вам нужно прямо противоположное. Начните с создания минимального воспроизводимого примера, чтобы вы могли воспроизвести проблему с известными входными данными.
У него есть 7 монет, и технически он может купить 7 плиток мороженого первого типа по 1 монете за каждую. Я предполагаю, что проблема неявно заключается в том, что мальчик не может купить более одного предмета каждого предмета.
@selbie Я думаю, что жадность должна работать, потому что я решил ту же проблему, используя цикл for, и он прошел все тестовые примеры, но не работает с циклом while :(
Просто вопрос, вы пытаетесь выучить C++ с помощью leetcode, или готовитесь к собеседованию, или просто развлекаетесь. Потому что, честно говоря, это плохой сайт для изучения С++. А для подготовки к собеседованию знания о дизайне/модульном тестировании стоят гораздо больше.
Когда вы задали этот вопрос на форумах LeetCode, какие ответы вы получили?
@OjaswiAwasthi - вы правы. Цель состоит в том, чтобы максимизировать количество предметов, а не максимальную ценность предметов. Следовательно, жадное решение работает лучше.





В цикле while вы не должны проверять, больше ли денег больше нуля, но вы должны проверить, возможна ли покупка другого мороженого. если вы этого не сделаете, вы можете потратить больше денег, чем у вас есть
while(coins - costs[i] > 0 && i < costs.size())
стоит отметить, что вы возвращаете количество оставшихся монет, а не количество купленного мороженого
Я бы написал функцию под названием bool can_buy_more_icecreams(...). Чтобы код читался while( can_buy_more_icecreams(...)), который рассказывает историю в коде. Это также одна из причин, по которой мне действительно не нравится leetcode, он действительно не учит людей, как писать поддерживаемый код (или даже хороший C++ в этом отношении).
.size()возвращаетsize_t, поэтому просто используйте это как тип дляi