Member 13527256 Ответов: 3

Я не вижу никаких проблем в этой задаче


В этой задаче у нас есть игрок в игре, у которого уже есть k (0 ≤ k ≤ 10^8) баллов, а максимальный уровень равен n (1 ≤ n ≤ 100). У нас есть массив (размер = n-1), который содержит количество баллов, которые игрок должен получить дополнительно к k, чтобы перейти на следующий уровень.
Output - текущий уровень игрока.
#include <iostream>
#include <vector>

using namespace std;

int main()
{
	int k = 0, n = 0;
	cin >> k >> n;
	vector <int> v(n-1);
	for (auto i = 0; i < n - 1; i++)
		cin >> v[i];
	int s = 0, l = 1;
	for (auto i = 0; i < n - 1; i++)
		if (s + v[i] <= k)
		{
			s += v[i];
			l++;
		}
	cout << l << endl;
}

Пример:
вход:
500 5
100 200 300 400
Выход:
3
--
вход
600 6
100 100 200 200 300
выход
5
-----------
В моем coledge у нас есть специальный сайт, который собирает и тестирует наши программы. Я сам тестировал эту программу на многих примерах и пытался переписать ее несколько раз, но она продолжает дробиться на тесте 8. Я не могу получить входные или выходные значения этого теста. Все из моей группы выполнили эту задачу, кроме меня. Они используют Си, но я использую Си++, потому что не знаю Си.

Что я уже пробовал:

переписать программу
проверял это много раз
искал такие же задачи в интернете

3 Ответов

Рейтинг:
28

CPallini

(Если я тебя поймаю) меняйся с

Цитата:
для (auto i = 0; i < n - 1; i++)
если (s + v[i] <= k)
{
s += v[i];
л++;
}
к
for (auto i = 0; i < n - 1; i++)
  if (s + v[i] > k)
    break;
  else
  {
    s += v[i];
    l++;
  }


Member 13527256

БОЛЬШОЕ СПАСИБО! После миллиарда моих попыток изменить его, ответ был так прост!

CPallini

Добро пожаловать.

Рейтинг:
2

OriginalGriff

Если вы "знаете С++", то вы знаете С - это подмножество с++.

Мы понятия не имеем, что делает "тест 8", и мы также понятия не имеем, каким должен быть результат и почему.
Внимательно прочитайте свой домашний вопрос и попробуйте запустить свой код в отладчике, используя свои собственные тестовые данные, и посмотреть, что именно происходит.

Мы не можем сделать это для вас.


Member 13527256

Если вы "знаете С++", то вы знаете С - это подмножество с++.
Теперь я имею в виду, что они используют malloc(), calloc(), printf(), scanf() и т. д., которых я не знаю.
Я просто хотел, чтобы другие люди просмотрели мой код - для них было бы легче найти ошибку.

OriginalGriff

Вот в чем проблема:
1) это не легче для нас, потому что мы понятия не имеем, что такое задача, или что на самом деле означает "сокрушение на тесте 8".
2) отладка вашего приложения-это то, что вы должны делать как часть своей домашней работы: если вы не узнаете о таком тривиальном коде, как этот, то как вы ожидаете справиться с более сложным кодом позже?
3) Если ваш курс связан с C, вы должны использовать C для его решения. Почему вы не знаете, как использовать malloc, printf и т. д.? Я уверена, что твой учитель объяснил их всему классу...

Member 13527256

Ну, я сказал, что протестировал свою программу на множестве различных значений, и она сработала. Я понятия не имею, на каком значении это не работает (давит - была ошибка), а также я понятия не имею, почему это на самом деле не работает.
Раньше я работал в другой группе, где они начали использовать cout/cin, new/delete, потому что их наставник считает malloc/calloc и printf/scanf слишком старыми и неудобными.
Собственно, в предыдущей группе (около года назад) Раньше я работал с классами и даже выиграл региональный конкурс программистов. Но потом мне пришлось переехать в другой город, и мой новый репетитор не так хорош, как предыдущий (более того, моя нынешняя группа только начала учиться программировать, так что ни они, ни репетитор меня не любят). Сейчас у меня обычно нет проблем с кодированием (на прошлой неделе у нас была еще более сложная задача, которую я сделал очень быстро), но эту задачу я действительно не понимаю. Я думаю, что этот код должен быть правильным, и я не могу понять, почему он не работает.

OriginalGriff

Если курс С, то чтобы получить оценку в конце его, вам придется использовать С, а не с++. А это означает изучение printf, malloc и забвение классов. Или перейти на курс C++...

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

Рейтинг:
1

Patrice T

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

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.