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

Arrays Exercise - (10. LadyBugs)

Здравейте, колеги! 5 часа дебъгвам и не разбирам защо на 6 и 8 тест Judge изкарва Time limit. Задачата логически не е сложна, но Judge се заяжда за някакво време. Всички останали тестове, с изключение на тези двата, си минават без проблем. Много бих се радвал ако някой може да ми обясни откъде идва забавянето. Благодаря предварително за отделеното време!

Pastebin -> https://pastebin.com/eWX633xh

Тагове:
0
C# Fundamentals
Dianov:
Заместването на for циклите в while цикъла с while цикли оправи проблема със забавянето без необходимост от промяна в логиката на кода. Problem solved!
Axiomatik avatar Axiomatik 1471 Точки

I remember from the Fundamentals + Advanced exercises that sometimes nesting loops or as in your case, using a for-loop inside of a while-loop can cause Time-Limit and in some extreme cases Memory-Limit (ie tripple/quadruple nested loops). Try to replace your for-loops with some while loops and your solution (even though correct) should be OK.

Demo-solution:

using System;
using System.Linq;

namespace ladyBugs
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] field = new int[int.Parse(Console.ReadLine())];
            int[] marker = Console.ReadLine().Split(" ", StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();

            foreach (var index in marker)
            {
                if (index < 0 || index > field.Length - 1)
                {
                    continue;
                }
                field[index] = 1;
            }

            string command = Console.ReadLine();

            while (command != "end")
            {
                string[] instructions = command.Split();
                int start = int.Parse(instructions[0]);
                int fly = int.Parse(instructions[2]);

                if (start < 0 || start >= field.Length || field[start] != 1)
                {
                    command = Console.ReadLine();
                    continue;
                }

                if (instructions[1] == "right")
                {
                    field[start] = 0;
                    int newIndex = start + fly;
                    while (newIndex < field.Length)
                    {
                        if (field[newIndex] == 1)
                        {
                            newIndex += fly;
                            continue;
                        }
                        field[newIndex] = 1;
                        break;
                    }
                }
                else if (instructions[1] == "left")
                {
                    field[start] = 0;
                    int newIndex = start - fly;
                    while (newIndex >= 0)
                    {
                        if (field[newIndex] == 1)
                        {
                            newIndex -= fly;
                            continue;
                        }
                        field[newIndex] = 1;
                        break;
                    }
                }
                command = Console.ReadLine();
            }

            foreach (int item in field)
            {
                Console.Write($"{item} ");
            }
        }
    }
}

 

1
Dianov avatar Dianov 5 Точки

Thank you, friend! It's not the first time that you are helping me. I really appreciate it!

2