Професионална програма
Loading...
rado_dimovm avatar rado_dimovm 0 Точки

Проблем задача 05. Bomb Numbers C#

Здравейте, колеги

Първи тест ми дава грешка и не успявам да разбера защо. Ако някой може да отдели време да ми погледне кода и да ми каже къде греша, ще съм много благодарен! Вече видях няколко чужди решения, но искам да разбера грешката в моето :)

https://pastebin.com/ayv1Zyhy

0
Fundamentals Module
E.Erol avatar E.Erol 13 Точки

Здравей, при мен беше същият проблем, когато изтривах съответният индекс. Накрая реших индекса да е равно на 0,а не да го изтривам и мина в judge.
Ето и решенията:

RemoveAt - 75/100 : https://pastebin.com/zJSrn9QS
index = 0 - 100/100 : https://pastebin.com/rsQNJKLe

0
heidan avatar heidan 2 Точки

Доста се мъчих и не успях. Решението ти е супер.

0
Joro_Paspalev avatar Joro_Paspalev 20 Точки

Здравейте, 

втори ден вече се мъча да мина от 75 на 100/100 със същия код като на колегата E.Erol RemoveAt - 75/100 : https://pastebin.com/zJSrn9QS.

Най-накрая ми светна че ако има 2 бомби една до друга при преминаване от една итерация на главния цикъл към следващата се пропуска номер на бомба и затова дава грешка на първи тест. Трябва просто когато се изтрият всички елементи преди да се завърти следващата итерация да се сложи i--; 

Ето примерен вход на това което казвам:

[4 4 4 2 3 4 7]

4 1

Ето и решение което дава 100/100 в Judge:

List<int> numbers = Console.ReadLine()
                .Split()
                .Select(int.Parse)
                .ToList();

            List<int> elements = Console.ReadLine()
                .Split()
                .Select(int.Parse)
                .ToList();

            int bombNum = elements[0];
            int power = Math.Abs( elements[1]);

            // Обхождам целия масив и търся дали ще намеря елемент равен на числото на бомбата
            for (int i = 0; i < numbers.Count; i++)
            {
                if (numbers[i] == bombNum)
                {
                    // Търся началната точка от къде да започна да трия
                    int start = i - power;

                    // Ако началната точка е извън пределите на индекса т.е. под нулевия индекс му казвам да започва от нулевия
                    if (start < 0)
                    {
                        start = 0;
                    }

                    // Търся крайната точка до къде да трия
                    int finish = i + power + 1;

                    // Ако крайния индекс за триене е по-голям от броя елементи, то тогава края му давам да бъде равен на number.count защото иначе Exeption
                    if (finish > numbers.Count)
                    {
                        finish = numbers.Count;
                    }

                    // След като имам начална и крайна точка въртя ги в цикъл и ги трия
                    for (int j = start; j < finish; j++)
                    {
                        numbers.RemoveAt(start);
                    }
                    i--;
                }
            }

            Console.WriteLine(numbers.Sum());

 

0
Savas avatar Savas 34 Точки

Благодаря момчета...

и аз се травмирах доста с тази задача и пропускът ми беше същия както при вас.
Затова смятам от тук нататък - ако правя промени в List докато го въртя в цикъл - ако е имало промяна направо да стартирам обхождане от i = 0 или ако ползвам while да му слагам условие while (testList.Contains(въпроснияЕлемент) ... което си е пак пълно обождане преди всеки лооп.

Верно, че неможе да се генерализира (зависи от конкретната ситуация) но, по-добре човек да си "върже гащите" (да си вземе 100/100 на изпита) от колкото да плете тънки логики, където не е ясно къде ще изгърмят и докато дебъгва - изпита де минал... 

Още веднъж благодаря 

0