Решение ошибок во время выполнения Kattis Jumbo Javelin с помощью C#

#c# #runtime-error #kattis

Вопрос:

Я новичок в Kattis и пытаюсь решить задачу Jumbo Javelin с помощью C#, но я получаю ошибку во время выполнения, даже если я выхожу из своей программы с 0.

Вот мой код:

 using System;

namespace JumboJavelin
{
    class Program
    {
        static void Main(string[] args)
        {
            int l = int.Parse(Console.ReadLine());
            int sum = 0;
            int loss = 1;

            for (int n = 0; n <= 100; n  )
            {
                sum  = l;

                if((n   1) % 2 == 0 amp;amp; !n.Equals(0))
                {
                    sum -= ((n   1) / 2)*loss;
                }

                try
                {
                    l = int.Parse(Console.ReadLine());
                }
                catch (FormatException)
                {
                    break;
                }
            }
            Console.WriteLine(sum);
            Environment.Exit(0);
        }
    }
}
 

Кто-нибудь, пожалуйста, может мне помочь? Я знаю, что мое решение в конечном итоге выдает неправильный ответ, но сейчас я пытаюсь избавиться от ошибки во время выполнения, так как она отлично работает в Visual Studio 2019.
Мы ценим любую помощь. Спасибо

Комментарии:

1. Содержит ли ошибка во время выполнения какие-либо сведения?

2. Является Environment.Exit(0) ли это необходимым? Глядя на страницу C# Kattis , там ничего не говорится о том, что это необходимо

3. @devNull Нет, Каттис, похоже, не говорит, где ошибка и на что она жалуется.

Ответ №1:

Если вы измените ошибку, на которую вы поймали Exception , вы увидите, что на самом деле это неправильный ответ, поэтому что-то идет не так. Вы действительно выходите из своей программы с кодом выхода 0 в нижней части кода, однако он выбрасывает Exception где-то еще. Две вещи, которые следует учитывать:

  1. Во-первых, в постановке задачи объясняется, что в качестве первого ввода вы получаете целое число N (это N указывает на количество стальных стержней, которые у него есть) и МОЖЕТ НАХОДИТЬСЯ между 1 и 100 ( 1 следовательно, не включительно 1<N<=100 ). Теперь у вас есть цикл, который всегда зацикливается от 1 до 100 . И цикл должен повторяться 1 до и включая любое значение N . Попробуйте посмотреть, что вы можете с этим поделать.
  2. Во-вторых, вы считываете входные данные в «хвосте» цикла. Это означает, что после последнего цикла вы выполняете еще один ввод для чтения. И что вы не читаете первый л. Попробуйте изменить чтение входных данных для l в начале цикла. (и первый ввод, который вы читаете в своем основном, не должен быть для l (см. пункт 1)).

Посмотрите, как далеко это вас заведет, если что-то не ясно, пожалуйста, дайте мне знать.

Ответ №2:

Как указал Каспер, n динамически предоставляется в первой строке; не думайте, что у вас есть 100 строк для сбора for (int n = 0; n <= 100; n ) .

Нет необходимости обрабатывать ошибки с форматом; Kattis всегда будет придерживаться указанного ими формата. Если что-то пойдет не так при анализе их ввода, нет смысла пытаться это уловить; вам решать, как исправить недоразумение. Лучше разбиться, а не ловить, чтобы вас не обманул Кэттис, сказавший вам, что сбой произошел из-за неправильного ответа.

Простой подход заключается в следующем:

  1. Соберите n данные из первой строки ввода; это преамбула
  2. Цикл от 0 до n , собирая каждую строку
  3. Суммируйте значения в строке в сумму
  4. Распечатайте sum - n 1 формулу , которую вы можете получить из их образцов
 using System;

class JumboJavelin
{
    static void Main(string[] args)
    {
        int n = int.Parse(Console.ReadLine());
        int sum = 0;

        for (int i = 0; i < n; i  )
        {
            sum  = int.Parse(Console.ReadLine());
        }

        Console.WriteLine(sum - n   1);
    }
}
 

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

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