Получение переполнения целого числа со знаком в задаче Leetcode

Я пытаюсь решить проблему: 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
.size() возвращает size_t, поэтому просто используйте это как тип для i
Adriano Repetti 06.01.2023 11:28

почему есть count и i ? Если все пойдет хорошо, они должны иметь одинаковое значение

463035818_is_not_a_number 06.01.2023 11:29

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

463035818_is_not_a_number 06.01.2023 11:40

У него есть 7 монет, и технически он может купить 7 плиток мороженого первого типа по 1 монете за каждую. Я предполагаю, что проблема неявно заключается в том, что мальчик не может купить более одного предмета каждого предмета.

selbie 06.01.2023 11:53

@selbie Я думаю, что жадность должна работать, потому что я решил ту же проблему, используя цикл for, и он прошел все тестовые примеры, но не работает с циклом while :(

Ojaswi Awasthi 06.01.2023 11:57

Просто вопрос, вы пытаетесь выучить C++ с помощью leetcode, или готовитесь к собеседованию, или просто развлекаетесь. Потому что, честно говоря, это плохой сайт для изучения С++. А для подготовки к собеседованию знания о дизайне/модульном тестировании стоят гораздо больше.

Pepijn Kramer 06.01.2023 14:54

Когда вы задали этот вопрос на форумах LeetCode, какие ответы вы получили?

Eljay 06.01.2023 15:36

@OjaswiAwasthi - вы правы. Цель состоит в том, чтобы максимизировать количество предметов, а не максимальную ценность предметов. Следовательно, жадное решение работает лучше.

selbie 07.01.2023 00:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
8
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

while(coins - costs[i] > 0 && i < costs.size())

стоит отметить, что вы возвращаете количество оставшихся монет, а не количество купленного мороженого

Я бы написал функцию под названием bool can_buy_more_icecreams(...). Чтобы код читался while( can_buy_more_icecreams(...)), который рассказывает историю в коде. Это также одна из причин, по которой мне действительно не нравится leetcode, он действительно не учит людей, как писать поддерживаемый код (или даже хороший C++ в этом отношении).

Pepijn Kramer 06.01.2023 14:57

Другие вопросы по теме